网上参考别人的例子,改自己的程序,终于搞明白了。原来在socket的服务器端设置线程并不是像之前想的那样,建立一个连接后就重新开一个端口去监听,这样的想法遇到了很多问题,首先,当我把客户端,弄成for循环递增的链接个格端口的时候,发现总是异常,因为服务器端的新的端口建立速度总是没有客户端的主动连接块,然后试图去让客户端创建新端口链接的速度降慢,但是一直没调试成功,并且即便是成功了。这个问题还是有隐患的,因为客户端的链接速度是不可控的,有两天,这个问题没有进展,后来在网上查到了,原来服务器端的线程,并不是用来创建新的端口的,之前也想过,一个服务器端不可能就连接一个客户端,但是没想出来解决办法,看了例子的提示后,才做出来,服务器端的线程是用来监听连接客户端的,即,当监听到客户端的连接请求时就会主动去创建一个socket线程去连接,完成客户端和服务器端的交互。后客户端自动断开链接。
核心代码:
Main 函数
ServerSocket serverSocket=null;
boolean listening=true;
try{
serverSocket=new ServerSocket(4700);
//创建一个ServerSocket在端口4700监听客户请求
}catch(IOException e) { }
while(listening){ //永远循环监听
newServerThread(serverSocket.accept(),clientnum)。start();
//监听到客户请求,根据得到的Socket对象和
客户计数创建服务线程,并启动之
clientnum++; //增加客户计数
}
serverSocket.close(); //关闭ServerSocket
设计ServerThread类
public class ServerThread extends Thread{
Socket socket=null; //保存与本线程相关的Socket对象
int clientnum; //保存本进程的客户计数
public ServerThread(Socket socket,int num) { //构造函数
this.socket=socket; //初始化socket变量
clientnum=num+1; //初始化clientnum变量
}
public void run() { //线程主体
try{//在这里实现数据的接受和发送
}