在上一篇完成了P2P的通行之后,只需要在服务端和客户端加入多线程,就可以实现服务器端和多个客户端进行通信,代码如下:
服务端线程:
</pre><pre name="code" class="java">import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
/***
*
* @author dell
*服务器端每次都要启动一个线程来对当前监听到的Socket进行通信处理
*/
public class ServerThread implements Runnable{
private Socket client; // 当前客户端对应的Socket
private BufferedReader read=new BufferedReader(new InputStreamReader(System.in)); // 用来从键盘读取信息
private PrintStream out; // 用来向当前的客户端Socket输出信息
private BufferedReader in;// 用来向当前的客户端的Socket读取信息
public ServerThread(Socket client) { // 构造方法
super();
this.client = client;
}
public void run() {
try {
out=new PrintStream(client.getOutputStream());
in=new BufferedReader(new InputStreamReader(client.getInputStream()));
out.println("服务器已经连接成功"); // 告诉客户端已经连接成功
out.flush();
while(true){
String msg=in.readLine(); // 读取客户端的信息
System.out.println("端口为"+client.getLocalPort()+"的客户说:"+msg);// 输出客户端的信息
msg=read.readLine(); // 从键盘得到服务器端的回复信息
out.println(msg);
out.flush(); // 输出缓冲流
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println(e.getMessage()); // 打印错误信息
}
finally{
try {
out.close();
in.close();
client.close();
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
}
}
}
客户端线程:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
/***
*
* @author dell
*服务器使用Socket连接上服务器之后,启动ClientThread 线程来处理该线程的Socket
*/
public class ClientThread implements Runnable {
private Socket server; //与服务器端对应的Socket
private BufferedReader read=new BufferedReader(new InputStreamReader(System.in)); // 用来从键盘读取信息
private PrintStream out; // 用来向当前的服务器端Socket输出信息
private BufferedReader in;// 用来向当前的服务器的Socket读取信息
public ClientThread(Socket server) {
super();
this.server = server;
}
public void run() {
try {
out=new PrintStream(server.getOutputStream());
in=new BufferedReader(new InputStreamReader(server.getInputStream()));
while(true){
String msg=in.readLine(); // 读取服务器的信息
System.out.println("服务器端的回复:"+msg);// 输出服务器的信息
msg=read.readLine(); // 从键盘得到向服务器的回复信息
out.println(msg);
out.flush(); // 输出缓冲流
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println(e.getMessage()); // 打印错误信息
}
finally{
try {
out.close();
in.close();
server.close();
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
}
}
}
服务器代码:
import java.net.ServerSocket;
import java.net.Socket;
public class MyServer {
/**
* @param args
*/
public static void main(String[] args) {
try {
ServerSocket ss=new ServerSocket(30000);
while(true){
Socket client=ss.accept();
ServerThread serverThread=new ServerThread(client);
new Thread(serverThread).start(); // 启动线程
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端代码:
import java.net.Socket;
public class MyClient {
public static void main(String[] args) {
try {
Socket client=new Socket("127.0.0.1",30000);
new Thread(new ClientThread(client)).start();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
由此可以运行多个客户端和同一个服务器端进行通信。