socket通信异常摘要及简介
- 格式:doc
- 大小:159.00 KB
- 文档页数:13
10004—WSAEINTR函数调用中断。
该错误表明由于对WSACancelBlockingCall的调用,造成了一次调用被强行中断。
10009—WSAEBADF文件句柄错误。
该错误表明提供的文件句柄无效。
在MicrosoftWindowsCE下,socket函数可能返回这个错误,表明共享串口处于“忙”状态。
10013—WSAEACCES权限被拒。
尝试对套接字进行操作,但被禁止。
若试图在sendto或WSASendTo中使用一个广播地址,但是尚未用setsockopt和SO_BROADCAST这两个选项设置广播权限,便会产生这类错误。
10014—WSAEFAULT地址无效。
传给Winsock函数的指针地址无效。
若指定的缓冲区太小,也会产生这个错误。
10022—WSAEINVAL参数无效。
指定了一个无效参数。
例如,假如为WSAIoctl调用指定了一个无效控制代码,便会产生这个错误。
另外,它也可能表明套接字当前的状态有错,例如在一个目前没有监听的套接字上调用accept或WSAAccept。
10024—WSAEMFILE打开文件过多。
提示打开的套接字太多了。
通常,Microsoft提供者只受到系统内可用资源数量的限制。
10035—WSAEWOULDBLOCK资源暂时不可用。
对非锁定套接字来说,如果请求操作不能立即执行的话,通常会返回这个错误。
比如说,在一个非暂停套接字上调用connect,就会返回这个错误。
因为连接请求不能立即执行。
10036—WSAEINPROGRESS操作正在进行中。
当前正在执行非锁定操作。
一般来说不会出现这个错误,除非正在开发16位Winsock应用程序。
10037—WSAEALREADY操作已完成。
一般来说,在非锁定套接字上尝试已处于进程中的操作时,会产生这个错误。
比如,在一个已处于连接进程的非锁定套接字上,再一次调用connect或WSAConnect。
另外,服务提供者处于执行回调函数(针对支持回调例程的Winsock函数)的进程中时,也会出现这个错误。
socket异常解决方案
《Socket异常解决方案》
在开发网络应用程序时,我们经常会遇到socket异常的问题。
socket异常可能会导致网络连接失败,数据传输中断,甚至导
致程序崩溃。
在面对这些问题时,我们需要及时解决并找出根本原因。
首先,我们需要了解造成socket异常的可能原因。
常见的原
因包括网络连接问题,服务器故障,数据包丢失等。
在了解了可能的原因后,就需要针对性地解决这些问题。
解决socket异常的方案可能包括以下几点:
1. 检查网络连接:确认网络连接是否正常,尝试其他网络环境,比如切换到4G网络或者使用VPN连接。
如果网络连接出现
问题,可能是导致socket异常的原因之一。
2. 重启服务器:如果是服务器端出现了问题,可以尝试重启服务器或者联系服务器管理员进行排查。
3. 检查数据包:数据包丢失可能会导致socket异常,对于这
种情况,我们可以使用数据包监控工具来检查数据传输情况,找出问题所在。
4. 异常处理:在程序中加入异常处理机制是很重要的,比如捕获socket异常并进行相应的处理,比如重新连接,重传数据
等。
5. 更新软件版本:有时socket异常可能是由于软件版本过低或者存在bug所致,及时更新软件版本可能解决这些问题。
总之,解决socket异常需要综合考虑网络环境、服务器端和客户端的问题,及时采取合理的措施来解决和避免出现异常情况。
希望上述的解决方案能帮助大家更好地解决socket异常的问题。
C#Socket通信三⼤问题详解C# Socket通信三⼤问题是什么呢?让我们开始讲述:C# Socket通信三⼤问题之数据包界限符问题。
根据原项⽬中交通部标准,在连续观测站中数据包中,使⽤﹤﹥两个字符表⽰有效数据包开始和结束。
实际项⽬有各⾃的具体技术规范C# Socket通信三⼤问题之数据包不连续问题。
在TCP/IP等通信中,由于时延等原因,⼀个数据包被Socket做两次或多次接收,此时在接收第⼀个包后,必须保存到TSession的DatagramBuffer中,在以后⼀并处理C# Socket通信三⼤问题包并发与重叠问题。
由于客户端发送过快或设备故障等原因,⼀次接收到⼀个半、两个或多个包⽂。
此时,也需要处理、⼀个半、两个或多个包先补充异步BeginReceive()回调函数EndReceiveData()中的数据包分合函数ResolveBuffer()。
下⾯是C# Socket通信三⼤问题的实例演⽰:/// ﹤summary﹥/// 1) 报⽂界限字符为﹤﹥,其它为合法字符,/// 2) 按报⽂头、界限标志抽取报⽂,可能合并包⽂/// 3) 如果⼀次收完数据,此时 DatagramBuffer 为空/// 4) 否则转存到包⽂缓冲区 session.DatagramBuffer/// ﹤/summary﹥private void ResolveBuffer(TSession session, int receivedSize){// 上次留下的报⽂缓冲区⾮空(注意:必然含有开始字符﹤,空时不含﹤)bool hasBeginChar = (session.DatagramBufferLength ﹥ 0);int packPos = 0; // ReceiveBuffer 缓冲区中包的开始位置int packLen = 0; // 已经解析的接收缓冲区⼤⼩byte dataByte = 0; // 缓冲区字节int subIndex = 0; // 缓冲区下标while (subIndex ﹤ receivedSize){// 接收缓冲区数据,要与报⽂缓冲区 session.DatagramBuffer 同时考虑dataByte = session.ReceiveBuffer[subIndex];if (dataByte == TDatagram.BeginChar) // 是数据包的开始字符﹤,则前⾯的包⽂均要放弃{// ﹤前⾯有⾮空串(包括报⽂缓冲区),则前⾯是错包⽂,防⽌ AAA﹤A,1,A﹥两个报⽂⼀次读现象if (packLen ﹥ 0){Interlocked.Increment(ref _datagramCount); // 前⾯有⾮空字符Interlocked.Increment(ref _errorDatagramCount); // ⼀个错误包this.OnDatagramError();}session.ClearDatagramBuffer(); // 清空会话缓冲区,开始⼀个新包packPos = subIndex; // 新包起点,即﹤所在位置packLen = 1;// 新包的长度(即﹤)hasBeginChar = true; // 新包有开始字符}else if (dataByte == TDatagram.EndChar) // 数据包的结束字符﹥{if (hasBeginChar) // 两个缓冲区中有开始字符﹤{++packLen; // 长度包括结束字符﹥// ﹥前⾯的为正确格式的包,则分析该包,并准备加⼊包队列AnalyzeOneDatagram(session, packPos, packLen);packPos = subIndex + 1; // 新包起点。
10004—WSAEINTR函数调用中断。
该错误表明由于对WSACancelBlockingCall的调用,造成了一次调用被强行中断。
10009—WSAEBADF文件句柄错误。
该错误表明提供的文件句柄无效。
在MicrosoftWindowsCE下,socket函数可能返回这个错误,表明共享串口处于“忙”状态。
10013—WSAEACCES权限被拒。
尝试对套接字进行操作,但被禁止。
若试图在sendto或WSASendTo中使用一个广播地址,但是尚未用setsockopt和SO_BROADCAST这两个选项设置广播权限,便会产生这类错误。
10014—WSAEFAULT地址无效。
传给Winsock函数的指针地址无效。
若指定的缓冲区太小,也会产生这个错误。
10022—WSAEINV AL参数无效。
指定了一个无效参数。
例如,假如为WSAIoctl调用指定了一个无效控制代码,便会产生这个错误。
另外,它也可能表明套接字当前的状态有错,例如在一个目前没有监听的套接字上调用accept或WSAAccept。
10024—WSAEMFILE打开文件过多。
提示打开的套接字太多了。
通常,Microsoft提供者只受到系统内可用资源数量的限制。
10035—WSAEWOULDBLOCK资源暂时不可用。
对非锁定套接字来说,如果请求操作不能立即执行的话,通常会返回这个错误。
比如说,在一个非暂停套接字上调用connect,就会返回这个错误。
因为连接请求不能立即执行。
10036—WSAEINPROGRESS操作正在进行中。
当前正在执行非锁定操作。
一般来说不会出现这个错误,除非正在开发16位Winsock应用程序。
10037—WSAEALREADY操作已完成。
一般来说,在非锁定套接字上尝试已处于进程中的操作时,会产生这个错误。
比如,在一个已处于连接进程的非锁定套接字上,再一次调用connect或WSAConnect。
另外,服务提供者处于执行回调函数(针对支持回调例程的Winsock函数)的进程中时,也会出现这个错误。
socket通信原理和实例讲解Socket通信原理是基于TCP/IP协议实现的一种传输层协议,它在网络上提供了一种可靠的数据传输方式。
Socket可以简单理解为一个管道,可以在不同的主机之间传递数据。
在Socket通信中,有两个最基本的角色:服务器和客户端。
服务器端创建一个Socket对象,并绑定到一个端口上,等待客户端的连接;客户端通过创建一个Socket对象,指定服务器的IP地址和端口号,与服务器建立连接。
一般的Socket通信流程如下:1. 服务器端创建Socket对象,并绑定到一个端口上;2. 服务器端通过监听函数等待客户端的连接请求;3. 客户端创建Socket对象,并指定服务器的IP地址和端口号,向服务器发起连接请求;4. 服务器接收到客户端的连接请求后,创建一个新的Socket对象,与客户端的Socket对象建立连接;5. 服务器和客户端通过各自的Socket对象进行通信,发送和接收数据;6. 通信完成后,服务器和客户端可以关闭各自的Socket对象。
下面是一个简单的Python实例,演示了基于Socket的服务器和客户端之间的通信:服务器端代码:```pythonimport socket# 创建一个Socket对象server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定到一个端口上server_socket.bind(('localhost', 8888))# 监听客户端的连接请求server_socket.listen(1)print("Waiting for connection...")# 接收客户端的连接请求client_socket, client_addr = server_socket.accept() print("Connected with", client_addr)# 接收客户端发送的数据data = client_socket.recv(1024).decode()print("Received:", data)# 发送响应数据给客户端response = "Hello, Client!"client_socket.send(response.encode())# 关闭连接client_socket.close()server_socket.close()```客户端代码:```pythonimport socket# 创建一个Socket对象client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 连接服务器server_addr = ('localhost', 8888)client_socket.connect(server_addr)# 向服务器发送数据data = "Hello, Server!"client_socket.send(data.encode())# 接收服务器的响应数据response = client_socket.recv(1024).decode()print("Received:", response)# 关闭连接client_socket.close()```以上就是Socket通信的原理和一个简单的实例讲解。
Socket的错误码和描述Socket的错误码和描述(中英文翻译)//下面是Socket Error的错误码和描述:Socket error 0 - Directly send errorSocket error 10004 - Interrupted function //call 操作被终止Socket error 10013 - Permission denied //c访问被拒绝Socket error 10014 - Bad address //c地址错误Socket error 10022 - Invalid argument //参数错误Socket error 10024 - Too many open files // 打开太多的socketsSocket error 10035 - Resource temporarily unavailable // 没有可以获取的资料Socket error 10036 - Operation now in progress // 一个阻塞操作正在进行中Socket error 10037 - Operation already in progress // 操作正在进行中Socket error 10038 - Socket operation on non-socket //非法的socket对象在操作Socket error 10039 - Destination address required //目标地址错误Socket error 10040 - Message too long //数据太长Socket error 10041 - Protocol wrong type for socket //协议类型错误Socket error 10042 - Bad protocol option // 错误的协议选项Socket error 10043 - Protocol not supported //协议不被支持Socket error 10044 - Socket type not supported //socket类型不支持Socket error 10045 - Operation not supported //不支持该操作Socket error 10046 - Protocol family not supported //协议族不支持Socket error 10047 - Address family not supported by protocol family//使用的地址族不在支持之列Socket error 10048 - Address already in use //地址已经被使用Socket error 10049 - Cannot assign requested address //地址设置失败Socket error 10050 - Network is down //网络关闭Socket error 10051 - Network is unreachable //网络不可达Socket error 10052 - Network dropped connection on reset //网络被重置Socket error 10053 - Software caused connection abort //软件导致连接退出Socket error 10054 - connection reset by peer //连接被重置Socket error 10055 - No buffer space available //缓冲区不足Socket error 10056 - Socket is already connected // socket已经连接Socket error 10057 - Socket is not connected //socket没有连接Socket error 10058 - Cannot send after socket shutdown //socket已经关闭Socket error 10060 - Connection timed out //超时Socket error 10061 - Connection refused //连接被拒绝Socket error 10064 - Host is down //主机已关闭Socket error 10065 - No route to host // 没有可达的路由Socket error 10067 - Too many processes //进程太多Socket error 10091 - Network subsystem is unavailable //网络子系统不可用Socket error 10092 - WINSOCK.DLL version out of range//winsock.dll版本超出范围Socket error 10093 - Successful WSAStartup not yet performed //没有成功执行WSAStartupSocket error 10094 - Graceful shutdown in progress //Socket error 11001 - Host not found //主机没有找到Socket error 11002 - Non-authoritative host not found // 非授权的主机没有找到Socket error 11003 - This is a non-recoverable error //这是个无法恢复的错误Socket error 11004 - Valid name, no data record of requested type //请求的类型的名字或数据错误WSAEADDRINUSE (10048) Address already in useWSAECONNABORTED (10053) Software caused connection abortWSAECONNREFUSED (10061) Connection refusedWSAECONNRESET (10054) Connection reset by peerWSAEDESTADDRREQ (10039) Destination address required WSAEHOSTUNREACH (10065) No route to hostWSAEMFILE (10024) Too many open filesWSAENETDOWN (10050) Network is downWSAENETRESET (10052) Network dropped connectionWSAENOBUFS (10055) No buffer space availableWSAENETUNREACH (10051) Network is unreachableWSAETIMEDOUT (10060) Connection timed outWSAHOST_NOT_FOUND (11001) Host not foundWSASYSNOTREADY (10091) Network sub-system is unavailableWSANOTINITIALISED (10093) WSAStartup() not performed WSANO_DATA (11004) Valid name, no data of that typeWSANO_RECOVERY (11003) Non-recoverable query error WSATRY_AGAIN (11002) Non-authoritative host foundWSAVERNOTSUPPORTED (10092) Wrong WinSock DLL version。
socket连接关闭问题分析socket编程过程中往往会遇到这样那样的问题,出现了这些问题,有的是由于并发访问量太⼤造成的,有些却是由于代码中编程不慎造成的。
⽐如说,最常见的错误就是程序中报打开的⽂件数过多这个错误。
socket建⽴连接的时候是三次握⼿,这个⼤家都很清楚,但是socket关闭连接的时候,需要进⾏四次挥⼿,但很多⼈对于这四次挥⼿的具体流程不清楚,吃了很多亏。
CLOSE_WAIT分析socket是⼀种全双⼯的通信⽅式,建⽴完socket连接后,连接的任何⼀⽅都可以发起关闭操作。
这⾥不妨假设连接的关闭是客户端发起。
客户端的代码如下:代码⽚段1.1ret = CS_GetConnect(&client,ipAddr,9010);if (ret == 0) {printf("connected success.");}CloseSocket(client);基本逻辑就是,连接建⽴后⽴即关闭。
其中CloseSocket函数是⾃定义函数,仅仅封装了在windows和linux下关闭socket的不同实现⽽已代码⽚段1.2#if defined(WIN32) || defined(WIN64)#define CloseSocket(fd) do{ closesocket(fd);/* shutdown(fd, 2);*/ }while(0)#else#define CloseSocket(fd) do{ close(fd); /*shutdown(fd,2);*/ }while(0)#endif客户端调⽤了CloseSocket之后,发送FIN信号到服务器端,告诉socket程序,连接已经断开。
服务器端接收到FIN信号后,会将⾃⾝的TCP状态置为`CLOSE_WAIT`,同时回复⼀个ACK信号给客户端,客户端接收到这个ACK信号后,⾃⾝将处于`FIN_WAIT_2`状态。
SocketError代码解释大全Socket Error代码解释大全Socket error 0 - Directly send errorSocket error 10004 - Interrupted function call一个封锁操作被对 WSACancelBlockingCall 的调用中断。
Socket error 10013 - Permission denied以一种访问权限不允许的方式做了一个访问套接字的尝试。
Socket error 10014 - Bad address系统检测到在一个调用中尝试使用指针参数时的无效指针地址。
Socket error 10022 - Invalid argument提供了一个无效的参数。
Socket error 10024 - Too many open files打开的套接字太多。
Socket error 10035 - Resource temporarily unavailable无法立即完成一个非阻止性套接字操作。
Socket error 10036 - Operation now in progress 目前正在执行一个阻止性操作。
Socket error 10037 - Operation already in progress 在一个非阻止性套接字上尝试了一个已经在进行的操作。
Socket error 10038 - Socket operation on non-socket 在一个非套接字上尝试了一个操作。
Socket error 10039 - Destination address required 请求的地址在一个套接字中从操作中忽略。
Socket error 10040 - Message too long 一个在数据报套接字上发送的消息大于内部消息缓冲区或其他一些网络限制,或该用户用于接收数据报的缓冲区比数据报小。
WSAEINTR (10004)∙翻译:中断函数调用。
∙说明:阻止操作被中断通过调用WSACancelBlockingCall (Wsapiref_704y.asp)。
WSAEACCES (10013)∙翻译:权限被拒绝。
∙说明:尝试访问套接字访问权限被禁止的方式。
例如,用于发送到广播的地址,但广播的权限未设置通过使用setsockopt(SO_BROADCAST) 时,将发生此错误。
另一个可能导致WSAEACCES 错误的原因是,当调用绑定(Wsapiref_6vzm.asp)函数(在Microsoft Windows NT 4.0 Service Pack 4 [SP4] 或更高版本),另一个程序、服务或内核模式驱动程序绑定到同一地址具有独占访问权。
这种独占的访问是一项新功能的Windows NT 4.0 SP4 和更高版本,并且它使用SO_EXCLUSIVEADDRUSE 选项的实现。
WSAEFAULT (10014)∙翻译:错误的地址。
∙说明:尝试使用指针参数的调用时,系统检测到一个无效的指针地址。
如果程序传递了无效的指针值,或者如果缓冲区的长度太小,则会发生此错误。
例如,如果一个参数,它是一种SOCKADDR 结构的长度小于sizeof(SOCKADDR) 的值,将发生此问题。
WSAEINVAL (10022)∙翻译:无效的参数。
∙说明:setsockopt (Wsapiref_94aa.asp) 函数提供了无效的参数(例如,指定参数的%)。
有时,它也就是从插座的当前状态,调用例如,未在侦听的套接字接受(Wsapiref_13aq.asp)。
WSAEMFILE (10024)∙翻译:打开的文件太多。
∙说明:有太多打开的套接字。
每个实现都可能具有套接字句柄可用的最大数目。
这些句柄可能会提供每个进程的全局,或每个线程。
WSAEWOULDBLOCK (10035)∙翻译:资源暂时不可用。
∙说明:将返回此错误,无法立即完成,例如,非阻塞套接字操作从接收(Wsapiref_2i9e.asp)时无数据排队要从套接字读取。
一、概述在计算机编程中,socket编程是一种常见的网络通信方式,通过socket可以实现不同主机之间的网络通信。
在使用socket编程时,经常会遇到各种错误,而这些错误通常会用errno枚举来表示。
errno 枚举定义了各种可能出现的错误类型,程序员可以根据errno的值来判断程序运行时出现的具体错误,从而进行相应的处理。
二、errno枚举errno枚举定义了许多可能出现的错误类型,下面我将按照错误类型进行分类介绍。
1. 常见错误类型在socket编程中,常见的错误类型包括但不限于以下几种:- EACCES:权限不足,通常指的是对某些系统资源的权限不够。
- EADDRINUSE:位置区域已被使用,通常指的是在绑定socket位置区域时,该位置区域已被其他进程占用。
- EAG本人N:资源暂时不可用,通常指的是资源暂时不可用,需要稍后重试。
- ECONNREFUSED:连接被拒绝,通常指的是远程主机拒绝连接请求。
- EFAULT:位置区域错误,通常指的是指针参数指向的位置区域无效。
- EINTR:中断系统调用,通常指的是系统调用被信号中断。
- EINVAL:无效参数,通常指的是传递给系统调用的参数无效。
- EIO:I/O错误,通常指的是发生了I/O错误。
- EISCONN:已连接,通常指的是socket已经连接。
2. 其他错误类型除了上述常见的错误类型外,errno枚举还定义了许多其他的错误类型,程序员在使用socket编程时可以根据实际情况进行具体的处理。
三、errno值每个错误类型在errno枚举中都有对应的数值,程序员可以通过这些数值来判断程序运行时出现的具体错误。
下面我将列举一些常见的errno值:1. EACCES的值为132. EADDRINUSE的值为483. EAG本人N的值为114. ECONNREFUSED的值为1115. EFAULT的值为146. EINTR的值为47. EINVAL的值为228. EIO的值为59. EISCONN的值为106四、处理错误在程序编写过程中,我们需要针对不同的错误类型进行相应的处理,以保证程序的健壮性和稳定性。
socket异常摘要编辑BindException ;试图将套接字绑定到本地地址和端口时发生错误的情况下,抛出此异常。
ConnectException ;试图将套接字连接到远程地址和端口时发生错误的情况下,抛出此异常。
HttpRetryException ;抛出此异常指示 HTTP 请求需要重试,但由于启用了流模式而无法自动重试。
MalformedURLException ;抛出这一异常指示出现了错误的 URL。
NoRouteToHostException ;试图将套接字连接到远程地址和端口时发生错误的情况下,抛出此异常。
PortUnreachableException ;在连接的数据报上已接收到 ICMP Port Unreachable 消息时,抛出该异常。
ProtocolException ;抛出此异常指示在底层协议中存在错误,如 TCP 错误。
SocketException ;抛出此异常指示在底层协议中存在错误,如 TCP 错误。
SocketTimeoutException ;如果在读取或接受套接字时发生超时,则抛出此异常。
UnknownHostException ;指示主机IP 地址无法确定而抛出的异常。
UnknownServiceException ;抛出这一异常指示出现了未知服务异常。
URISyntaxException ;抛出经过检查的指示字符串不能解析为 URI 引用的异常。
一、Socket通信简介Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信。
两者的最大差异在于,http 连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据。
而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求。
那么,什么是socket?Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信。
通过建立socket连接,可为通信双方的数据传输传提供通道。
socket的主要特点有数据丢失率低,使用简单且易于移植。
1.1什么是Socket Socket是一种抽象层,应用程序通过它来发送和接收数据,使用Socket可以将应用程序添加到网络中,与处于同一网络中的其他应用程序进行通信。
简单来说,Socket提供了程序内部与外界通信的端口并为通信双方的提供了数据传输通道。
1.2Socket的分类根据不同的的底层协议,Socket的实现是多样化的。
本指南中只介绍TCP/IP协议族的内容,在这个协议族当中主要的Socket类型为流套接字(streamsocket)和数据报套接字(datagramsocket)。
流套接字将TCP作为其端对端协议,提供了一个可信赖的字节流服务。
数据报套接字使用UDP协议,提供数据打包发送服务。
下面,我们来认识一下这两种Socket 类型的基本实现模型。
二、Socket 基本通信模型三、Socket基本实现原理3.1基于TCP协议的Socket服务器端首先声明一个ServerSocket对象并且指定端口号,然后调用Serversocket的accept()方法接收客户端的数据。
accept()方法在没有数据进行接收的处于堵塞状态。
(Socketsocket=serversocket.accept()),一旦接收到数据,通过inputstream读取接收的数据。
客户端创建一个Socket对象,指定服务器端的ip地址和端口号(Socketsocket=newSocket("172.168.10.108",8080);),通过inputstream读取数据,获取服务器发出的数据(OutputStreamoutputstream=socket.getOutputStream()),最后将要发送的数据写入到outputstream即可进行TCP协议的socket数据传输。
3.2基于UDP协议的数据传输服务器端首先创建一个DatagramSocket对象,并且指点监听的端口。
接下来创建一个空的DatagramSocket对象用于接收数据(bytedata[]=newbyte[1024;]DatagramSocketpacket=newDatagramSocket(data,data.length)),使用DatagramSocket的receive方法接收客户端发送的数据,receive()与serversocket的accepet()类似,在没有数据进行接收的处于堵塞状态。
客户端也创建个DatagramSocket对象,并且指点监听的端口。
接下来创建一个InetAddress 对象,这个对象类似与一个网络的发送地址(InetAddressserveraddress=InetAddress.getByName("172.168.1.120")).定义要发送的一个字符串,创建一个DatagramPacket对象,并制定要讲这个数据报包发送到网络的那个地址以及端口号,最后使用DatagramSocket的对象的send()发送数据。
*(Stringstr="hello";bytedata[]=str.getByte();DatagramPacketpacket=new DatagramPacket(data,data.length,serveraddress,4567);socket.send(packet);)四、android 实现socket简单通信前言:添加权限[java]view plaincopyprint?1.<!--允许应用程序改变网络状态-->2.<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>3.4.<!--允许应用程序改变WIFI连接状态-->5.<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>6.7.<!--允许应用程序访问有关的网络信息-->8.<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>9.10.<!--允许应用程序访问WIFI网卡的网络信息-->11.<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>12.13.<!--允许应用程序完全使用网络-->14.<uses-permission android:name="android.permission.INTERNET"/>4.1使用TCP协议通信android端实现:[java]view plaincopyprint?1.protected void connectServerWithTCPSocket() {2.3.Socket socket;4.try {// 创建一个Socket对象,并指定服务端的IP及端口号5.socket = new Socket("192.168.1.32", 1989);6.// 创建一个InputStream用户读取要发送的文件。
7.InputStream inputStream = new FileInputStream("e://a.txt");8.// 获取Socket的OutputStream对象用于发送数据。
9.OutputStream outputStream = socket.getOutputStream();10.// 创建一个byte类型的buffer字节数组,用于存放读取的本地文件11.byte buffer[] = new byte[4 * 1024];12.int temp = 0;13.// 循环读取文件14.while ((temp = inputStream.read(buffer)) != -1) {15.// 把数据写入到OuputStream对象中16.outputStream.write(buffer, 0, temp);17.}18.// 发送读取的数据到服务端19.outputStream.flush();20.21./** 或创建一个报文,使用BufferedWriter写入,看你的需求 **/22.// String socketData = "[2143213;21343fjks;213]";23.// BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(24.// socket.getOutputStream()));25.// writer.write(socketData.replace("\n", " ") + "\n");26.// writer.flush();27./************************************************/28.} catch (UnknownHostException e) {29.e.printStackTrace();30.} catch (IOException e) {31.e.printStackTrace();32.}33.34.}服务器端简单实现:[java]view plaincopyprint?1.public void ServerReceviedByTcp() {2.// 声明一个ServerSocket对象3.ServerSocket serverSocket = null;4.try {5.// 创建一个ServerSocket对象,并让这个Socket在1989端口监听6.serverSocket = new ServerSocket(1989);7.// 调用ServerSocket的accept()方法,接受客户端所发送的请求,8.// 如果客户端没有发送数据,那么该线程就停滞不继续9.Socket socket = serverSocket.accept();10.// 从Socket当中得到InputStream对象11.InputStream inputStream = socket.getInputStream();12.byte buffer[] = new byte[1024 * 4];13.int temp = 0;14.// 从InputStream当中读取客户端所发送的数据15.while ((temp = inputStream.read(buffer)) != -1) {16.System.out.println(new String(buffer, 0, temp));17.}18.serverSocket.close();19.} catch (IOException e) {20.e.printStackTrace();21.}22.}4.2使用UDP协议通信客户端发送数据实现:[java]view plaincopyprint?1.protected void connectServerWithUDPSocket() {2.3.DatagramSocket socket;4.try {5.//创建DatagramSocket对象并指定一个端口号,注意,如果客户端需要接收服务器的返回数据,6.//还需要使用这个端口号来receive,所以一定要记住7.socket = new DatagramSocket(1985);8.//使用InetAddress(Inet4Address).getByName把IP地址转换为网络地址9.InetAddress serverAddress = InetAddress.getByName("192.168.1.32");10.//Inet4Address serverAddress = (Inet4Address)Inet4Address.getByName("192.168.1.32");11.String str = "[2143213;21343fjks;213]";//设置要发送的报文12.byte data[] = str.getBytes();//把字符串str字符串转换为字节数组13.//创建一个DatagramPacket对象,用于发送数据。