JAVA服务器与客户端的socket通信问题

JAVA服务器与客户端的socket通信问题,第1张

你可以在每个用户连上服务器端时,都发送一个消息,就是用4个字节表示是用户的ID,并将与用户通信的socket,用一个HashMap存储起来,而不是用LinkList。
后面如果A发送消息给C,就把A的前四个字节(即ID)取出来,在HashMap中找到与C通信的socket,然后把消息通过socket发送出去····
这部分代码应该很容易实现的,Socket通信这东西,理清了思路就很好弄了~~

1PC服务器启用ServerSocket两个通信实体在建立虚拟链路之前,需要有一方先准备好,主动接受来自其他通信实体的连接请求。使用ServerSocket对象监听来自客户端的Socket连接。//创建ServerSocket对象ServerSocketss=newServerSocket(30000);//监听来自客户端的请求while(true){Sockets=ssaccept();…}如果没有连接,则将一直处于等待状态。当接收到连接请求后,获取消息到输入流,并保存到文件。//接收客户端消息BufferedReaderin=newBufferedReader(newInputStreamReader(clientgetInputStream()));Stringstr;BufferedWriterbw=newBufferedWriter(newFileWriter("D:/ApInfo"+(i++)+"txt"));while((str=inreadLine())!=null){Systemoutprintln(str);bwwrite(str);bwnewLine();}2Android终端使用Socket通信客户端使用Socket的构造器连接服务器,指定服务器IP和端口号就可以了。Sockets=newSocket(“1921681100”,30000);这样服务器端的accept()方法就得到响应,从而向下执行,服务器端和客户端就形成了一对互相连接的Socket。再进行通信时就没有服务器和客户端之分了,都是通过输入输出流进行通信。详细步骤:采用Handler和TimerTask来定时扫描AP信息并发送给服务器端。TimerTask规定了到达指定的时间所要进行的任务。TimerTasktask=newTimerTask(){publicvoidrun(){Messagemessage=newMessage();messagewhat=1;handlersendMessage(message);}};handler传递message内容:Handlerhandler=newHandler(){publicvoidhandleMessage(Messagemsg){switch(msgwhat){case1://执行定时器时间到了之后由handler传递的任务break;}superhandleMessage(msg);}}接下来扫描AP信息并发送给服务器端,然后将结果保存。WifiManagerwifiManager=(WifiManager)getSystemService(WIFI_SERVICE);wifiManagerstartScan();mWifiList=wifiManagergetScanResults();由WifiManager说明可知,它可以用于处理已配置的网络,当前连接的网络及AP信息的扫描等情况。向服务器发送消息:socket=newSocket("1921681211",30000);//向服务器端发送消息PrintWriterout=newPrintWriter(newBufferedWriter(newOutputStreamWriter(socketgetOutputStream())),true);outprintln(message);其中message为获取的AP信息,测试收到的信息格式为:SSID:ICIS_LAB,BSSID:1c:af:f7:9a:65:e4,capabilities:[WPA-PSK-TKIP+CCMP],level:-80,frequency:2437

网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等 *** 作都是通过该Socket实现的。
下面用Socket实现一个windows下的c语言socket通信例子,这里我们客户端传递一个字符串,服务器端进行接收。
服务器端
#include "stdafxh"
#include <stdioh>
#include <winsock2h>
#include <winsock2h>
#define SERVER_PORT 5208 //侦听端口
void main()

1客户端连接到代理服务器开放的端口;
2客户端向代理服务器发送验证申请;
3代理服务器向客户端发送一个数据包,从而客户端得知自己的通信申请是否被批准;
4客户端向代理服务器发送一个数据包,告知代理服务器自己要连接的目的主机的地址和端口;
5代理服务器开始进行到目的主机的真正连接;
6代理服务器为客户端开放一个新的端口并向客户端发送一个数据包告知客户端这个新的端口;
7客户端创建一个新的套接字并连接到代理服务器的新的端口;
8然后,代理服务器把由新端口接收到的数据都转发给目的主机,把从目的主机发过来的数据都由新端口转发给客户端。

获取从客户端读入的字符串Stringresult=bufferedReaderreadLine();这里会阻塞。你服务器端获取Socket以后需要另外启动一个线程去处理,你现在是单线程的服务器端设计,当然只能接收一次请求了。服务器端接收到Socket以后应该启动一个线程newThread(newRunable(){})start();


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10629554.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存