(一)、线程池TCP通信 //旨在多个socket建立一起运行
1.服务端
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;public class ServerDemo2 {
//使用静态变量记住一个线程池
private static ExecutorService pool = new ThreadPoolExecutor(3,5,
6, TimeUnit.SECONDS,new ArrayBlockingQueue<>(2), Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
public static void main(String[] args) {
try {
System.out.println("服务端启动成功");
ServerSocket serverSocket = new ServerSocket(7777);
while(true){
Socket socket = serverSocket.accept();
System.out.println(socket.getLocalSocketAddress() + "来了");
Runnable target = new ServerReaderRunnable(socket);
pool.execute(target);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}Runnable继承类实现线程交互
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;public class ServerReaderRunnable implements Runnable{
private Socket socket;
public ServerReaderRunnable(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InputStream is = socket.getInputStream();//getInputStream方法得到的是一个输入流,服务端的Socket对象上的getInputStream方法得到的输入流其实就是从客户端发送给服务器端的数据流。
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String msg;
while ((msg = br.readLine()) != null){
System.out.println(socket.getRemoteSocketAddress() + "说:" + msg);
}
} catch (IOException e) {
System.out.println(socket.getRemoteSocketAddress());
}
}
}
2.客户端
import java.io.OutputStream; import java.io.PrintStream; import java.net.Socket; import java.util.Scanner; public class ClientDemo1 { public static void main(String[] args) { try { Socket socket = new Socket("127.0.0.1",7777); OutputStream os = socket.getOutputStream(); //getOutputStream方法得到的是一个输出流,客户端的Socket对象上的getOutputStream方法得到的输出流其实就是发送给服务器端的数据。 PrintStream ps = new PrintStream(os); Scanner sc = new Scanner(System.in); while(true){ System.out.println("请说:"); String msg = sc.nextLine(); ps.println(msg); ps.flush(); } } catch (Exception e) { e.printStackTrace(); } } }
(二)、TCP即时通信
1.服务端
import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; public class ServerDemo3 { public static List<Socket> allOnLineSockets = new ArrayList<>(); //收集socket,到时候一起遍历,增删也快捷 public static void main(String[] args) throws Exception{ System.out.println("服务端启动成功"); ServerSocket serverSocket = new ServerSocket(7777); while(true){ Socket socket = serverSocket.accept(); System.out.println(socket.getRemoteSocketAddress() + "来了!"); allOnLineSockets.add(socket); new ServerReaderThread(socket).start(); } } } class ServerReaderThread extends Thread { private Socket socket; public ServerReaderThread(Socket socket) { this.socket = socket; } public void run(){ try { InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line; while ((line = br.readLine())!=null){ System.out.println(socket.getRemoteSocketAddress() + "发了:" +line); //把消息进行端口发出去 sendMsgToAll(line); } } catch (Exception e) { System.out.println(socket.getRemoteSocketAddress()+"下线了,下次再来!"); ServerDemo3.allOnLineSockets.remove(socket); } } private void sendMsgToAll(String msg) throws Exception { for (Socket allOnLineSocket : ServerDemo3.allOnLineSockets) { PrintStream ps = new PrintStream(socket.getOutputStream()); ps.println(msg); ps.flush(); } } }
2.客户端
import java.io.*; import java.net.Socket; import java.util.Scanner; public class ClientDemo1 { public static void main(String[] args) { try { Socket socket = new Socket("127.0.0.1",7777); OutputStream os = socket.getOutputStream(); PrintStream ps = new PrintStream(os); Scanner sc = new Scanner(System.in); while(true){ System.out.println("请说:"); String msg = sc.nextLine(); ps.println(msg); ps.flush(); } } catch (Exception e) { e.printStackTrace(); } } } class CilentReaderThread extends Thread{//客户端读消息 private Socket socket; public CilentReaderThread(Socket socket){ this.socket = socket; } public void run(){ try { InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line; while((line = br.readLine())!=null){ System.out.println("收到消息" + line); } } catch (Exception e){ System.out.println("服务端把你踢出去了!"); } } }
(三)、TCP通信实现BS请求网页信息(基础)
HTTP响应数据的协议格式:就是给浏览器显示的网页信息
import java.io.*; import java.net.Socket; public class ServerReaderRunnable implements Runnable{ private Socket socket; public ServerReaderRunnable(Socket socket) { this.socket = socket; } @Override public void run() { try { //响应消息给浏览器 PrintStream ps = new PrintStream(socket.getOutputStream()); //必须相应HTTP协议格式数据,否则不通 ps.println("HTTP/1.1 200 OK");//协议类型和版本,响应成功的消息 ps.println("Content-Type:text/htnl;charset=UTF-8");//响应的数据类型:文本/网页 ps.println();//必须发一个空行 //以上操作之后才能响应数据给浏览器 ps.println("<span style='color:red;font-size:90px'> 超级无敌牛逼 </span>"); ps.close(); } catch (Exception e) { System.out.println(socket.getRemoteSocketAddress()); } } }