突然想写个代码,一个线程处理多个tcp通讯。
包结构
--base
--cache
--cli
--server
package com.self.socket.base;
import java.io.*;
import java.net.Socket;
/**
*/
public class BaseSocket {
public static String ip="localhost";
public static int port =10086;
protected Socket socket=null;
protected OutputStream outputStream=null;
protected PrintWriter printWriter=null;
protected InputStream inputStream=null;
protected BufferedReader bufferedReader=null;
protected void ioStream() {
try {
inputStream = socket.getInputStream();
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
printWriter=new PrintWriter(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
protected void write(String str){
printWriter.println(str);
printWriter.flush();
}
protected void close(){
try {
printWriter.close();
outputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class SocketCache {
//存放socket 一直遍历循环 检测是否有数据过来
public static ConcurrentHashMap<Integer,ServerWork> cacheSocket=new ConcurrentHashMap<Integer, ServerWork>();
}
package com.self.socket.cli;
import com.self.socket.base.BaseSocket;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
/**
*/
public class MySocketCli extends BaseSocket implements Runnable{
public static void main(String[] args) {
MySocketCli mySocketCli=new MySocketCli();
mySocketCli.run();
}
public void run() {
try {
socket = new Socket(ip, port);
ioStream();
Scanner scanner = new Scanner(System.in);
String print = "";
do {
System.out.print("请输入:");
print = scanner.nextLine();
write(print);
String result=bufferedReader.readLine();
System.out.println("server response:"+result);
} while (!print.equals("quit"));
} catch (IOException e) {
e.printStackTrace();
}finally {
close();
}
}
}
package com.self.socket.server;
import com.self.socket.base.BaseSocket;
import com.self.socket.cache.SocketCache;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;
/**
*/
public class RegisterSocket extends BaseSocket{
//存放socket任务
static LinkedBlockingQueue queue=new LinkedBlockingQueue();
public static void main(String[] args) {
ServerSocket serverSocket= null;
try {
serverSocket = new ServerSocket(port);
work();
for(;;){
Socket socket=serverSocket.accept();
System.out.println("一个新客户端进来了!");
ServerWork serverWork =new ServerWork(socket);
SocketCache.cacheSocket.put(serverWork.hashCode(), serverWork);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void work(){
new Thread(new Runnable() {
public void run() {
ExecutorService executorService= Executors.newFixedThreadPool(1);
executorService.execute(new Runnable() {
@Override
public void run() {
try {
for(;;){
ServerWork serverWork = (ServerWork)queue.take();
serverWork.doGet();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
for (;;) {
for (ServerWork serverWork:SocketCache.cacheSocket.values()) {
if(serverWork.isAvailable()){
try {
System.out.println("name:"+serverWork.hashCode());
queue.put(serverWork);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}).start();
}
}
package com.self.socket.server;
import com.self.socket.base.BaseSocket;
import com.self.socket.cache.SocketCache;
import java.io.*;
import java.net.Socket;
/**
*/
public class ServerWork extends BaseSocket{
private StringBuffer sb=new StringBuffer();
public ServerWork(Socket socket) {
this.socket=socket;
ioStream();
}
public synchronized boolean isAvailable(){
try {
if(inputStream.available()>0){
sb.append(bufferedReader.readLine());
return true;
}
return false;
} catch (IOException e) {
e.printStackTrace();
close();
SocketCache.cacheSocket.remove(this.hashCode());
return false;
}
}
public synchronized void doGet() {
System.out.println(Thread.currentThread().getName()+" server is running");
String result=sb.toString();
sb.setLength(0);
System.out.println("结果:"+result);
write("ok");
}
}
启动:运行 RegisterSocket 和 MySocketCli main方法;