在上一篇文章中,简单的介绍了java中入门级的socket编程,简单的实现了客户端像服务器端发送数据,服务器端将数据接收并显示在控制台,没有涉及多线程。上一篇文章的链接:Java中利用socket实现简单的服务端与客户端的通信(入门级)
这次,我们将上一节中的代码进行少许的更改,将服务器更改为多线程,使得服务器可以为多个客户端服务。
因为是服务器端实现的多线程,所以客户端的代码不用做任何更改,和上一篇中的一样。只需要对服务端的代码进行稍许更改即可。
在项目中新建一个类,这个类就是线程类,所以要继承自Thread类,该类的代码如下:
package server_1;在上述代码中,MyThread的构造函数将socket传入类内部的socket中,同时,将通信的 主要任务都写在了这个线程类中。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class MyThread extends Thread {
//
Socket socket=null;
public MyThread(Socket socket) throws Exception{
this.socket=socket;
}
public void run(){
BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //启动缓冲区
//out = new PrintWriter(client.getOutputStream());
while (true) {
String msg=null;
try {
msg = in.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // 将客户端发送来的信息存储在msg中
System.out.println(msg);
if (msg.equals("shutdown")) { //客户端如果发送的是shutdown,就关闭客户端
break;
}
}
try {
in.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //执行相应的关闭操作
}
}
以下是主类中的代码:
package server_1;可以看到,此次在服务端加了一个没有退出条件的循环操作,循环中监听网络中的socket信息,当有客户端连接的时候,就讲这个socket传给一个线程去执行,同时显示出目前连接到服务端的客户端的数量。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class server_1 {
public static void main(String[] args) throws Exception { //将异常全部抛出
ServerSocket server = new ServerSocket(10000); //用serversocket来启动服务器,并指定端口号
System.out.println("服务器启动。。。");
int count=0;
while(true){
Socket socket = server.accept(); //获取客户端的socket信息
MyThread mythread=new MyThread(socket);
mythread.start();
count++;
System.out.println("客户端数量为:"+count);
}
//server.close();
//PrintWriter out = null;
//}
}
}
测试时,先运行服务端,然后打开两次客户端,分别像服务端发送数据,可以看到服务端可以显示出连接的客户端的数量,并且可以正常的显示客户端发送过来的数据。
2015年11月19日 西安交通大学