TCP程序
TCP是面向连接的协议,java.net包中拥有相关的类。
ServerSocket:实现服务器端套接字
Socket:实现客户端套接字(Socket的翻译即套接字,是两台机器之间通信的端点)
Socket是网络驱动层提供给应用程序编程的接口的一种机制。
服务器端的Socket
ServerSocket类实现了服务器端Socket
方法名 | 功能 |
---|---|
ServerSocket(int port) | 创建绑定到port端口的服务器Socket |
InetAddress getInetAddress() | 返回此服务器Socket的本机地址 |
Socket accept() | 监听并接收Socket的连接 |
单客户端对服务器
服务器程序
package com.chen;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {
public static void main(String[] args){
ServerSocket ss = null;
Socket s = null;
try {
ss = new ServerSocket(10086);
s = ss.accept();//方法会阻塞,无连接则会一直等待。
System.out.println("Server:");
InputStream in = s.getInputStream();//得到输入流
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String info = br.readLine();
System.out.println(info);
OutputStream out = s.getOutputStream();
PrintStream ps = new PrintStream(out);
ps.println(info);
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端程序
package com.chen;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
public class ClientDemo {
public static void main(String[] args){
Socket s = null;
try {
s = new Socket("localhost",10086);
System.out.println("Client:");
OutputStream out = s.getOutputStream();
InputStream in = s.getInputStream();
PrintStream ps = new PrintStream(out);
ps.println("Hello");
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String info = br.readLine();
System.out.println(info);
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
多客户端对服务器通讯
简要思路:多个客户端怎么和服务端通信又不互相影响呢,这个时候可以建立一个服务线程,每连接一个客户端,就开一个线程,互不影响。
线程类
package com.chen;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
public class ClientThread implements Runnable {
private Socket socket;
public ClientThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
System.out.println("客户端的IP:"+socket.getInetAddress().getHostAddress());
InputStream in = socket.getInputStream();//得到输入流
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String info = br.readLine();
System.out.println(info);
OutputStream out = socket.getOutputStream();
PrintStream ps = new PrintStream(out);
ps.println(info);
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
服务端
package com.chen;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MoreServerDemo {
public static void main(String[] args){
ExecutorService es = Executors.newCachedThreadPool();
ServerSocket ss = null;
try {
ss = new ServerSocket(10086);
while(true){
Socket s = ss.accept();//方法会阻塞,无连接则会一直等待。
es.execute(new ClientThread(s));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端程序不变