java中的多线程见其他篇章,再这我就简述一些我对TCP中多线程的理解
上篇已提到TCP是一种可靠连接,需要客户端和服务端共同作用传输;
但实际中我们见的大部分都是一对多,即一个服务端,有多个客户端,甚至有多对多,多个服务端对多个客户端
对于TCP中的多线程,我今天就一对多情况的思路做以简单介绍,简而言之,就是当客户向服务端发送请求时,服务端用一个集合类来接收,并在线程同步中,根据需要进行传输数据,并且关闭长久时间不用的连接
代码简单如下:
//服务端
package TCP2;
import java.io.IOException;
import java.net.*;
import java.util.ArrayList;
public class Server {
public static ArrayList<Socket> sl=new ArrayList<Socket>();
public static void main(String[] args) throws IOException{
ServerSocket ss=new ServerSocket(30000);
while(true){
Socket s=ss.accept();
sl.add(s);
new Thread(new ServerXain(s)).start();
}
}
}
package TCP2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
public class ServerXain implements Runnable {
private Socket s=null;
private BufferedReader br=null;
//Socket 传的输入流
public ServerXain(Socket s) throws IOException{
// TODO Auto-generated constructor stub
this.s=s;
br=new BufferedReader(new InputStreamReader(s.getInputStream()));
}
public synchronized void run() {
// TODO Auto-generated method stub
try {
String content=null;
while((content=readFromClient())!=null){
for(Socket s:Server.sl){
PrintStream ps=new PrintStream(s.getOutputStream());
ps.println(content);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private String readFromClient() {
// TODO Auto-generated method stub
try {
return br.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
Server.sl.remove(s);
}
return null;
}
}
//客户端
package TCP2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException{
Socket s=new Socket("127.0.0.1",30000);
new Thread(new ClientXian(s)).start();
PrintStream ps=new PrintStream(s.getOutputStream());
String line=null;
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
while((line=br.readLine())!=null){
ps.println(line);
}
}
}
package TCP2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class ClientXian implements Runnable{
private Socket s=null;
BufferedReader br=null;
public ClientXian(Socket s) throws IOException{
// TODO Auto-generated constructor stub
this.s=s;
br=new BufferedReader(new InputStreamReader(s.getInputStream()));
}
public synchronized void run() {
// TODO Auto-generated method stub
try {
String content=null;
while((content=br.readLine())!=null){
System.out.println(content);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}