1. 典型的 TCP Client :
(1) 创建 Socket 实例:构造方法向指定的远程主机和端口建立一个TCP连接;
(2) 通过Socket实例的输入输出流(InputStream和OutputStream)进行通信;
(3) 通信完毕后用Socket类的close()方法关闭连接。
2. 典型的 TCP Server :
(1) 创建一个ServerSocket 实例并指定本地端口,功能是监听指定端口接收到的连接;(注意:ServerSocket的实例并不是Socket)
(2)重复执行以下过程:
A. 调用ServerSocket的accept()方法以获取下一个客户端连接。基于新建立的客户端连接,创建一个Socket实例,并由accept()方法返回;
B. 使用所返回的Socket实例的InputStream和OutputStream和客户端进行通信;
C.通信完毕后用Socket类的close()方法关闭该客户端Socket连接。
实例程序:
1.简单的建立连接
Client.java
import java.net.Socket;
import java.net.UnknownHostException;
import java.io.IOException;
public class Client{
public static void main(String[] args){
/*
*public Socket()
* Creates an unconnected socket, with the system-default type of SocketImpl.
*/
try{
Socket client = new Socket("127.0.0.1",2013);
}
catch(UnknownHostException uhe){
uhe.printStackTrace();
}
catch(IOException ioex){
ioex.printStackTrace();
}
}
}
Server.java
import java.net.ServerSocket;
import java.io.IOException;
public class Server{
public static void main(String[] args){
/*
*java.net.ServerSocket
*
*public ServerSocket(int port)
* throws IOException
*Creates a server socket, bound to the specified port.
*
*public Socket accept()
* throws IOException
*Listens for a connection to be made to this socket and accepts it.
*
* ServerSocket 不是Socket,只是负责“接受”连接
*/
try{
ServerSocket server = new ServerSocket(2013);
System.out.println("服务器等待。。。");
server.accept(); //阻塞线程
System.out.println("客户端已连接OK!");
}
catch(IOException ioex){
ioex.printStackTrace();
}
}
}
2.TCP通信
Client.java
import java.net.Socket;
import java.net.UnknownHostException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.PrintStream;
public class Client{
public static void main(String[] args){
try{
//建立连接
Socket clientSocket = new Socket("127.0.0.1",2013);
//返回打印流(将客户端Socket的输出流包装成打印流(过滤流)
PrintStream socketOut = new PrintStream(
clientSocket.getOutputStream());
//将字节流对象System.in包装成缓冲流
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
String keyLine = null;
while((keyLine = br.readLine()) != null){
//System.out代表屏幕节点流,所以输出到屏幕
//System.out.println(keyLine);
//socketOut代表Socket节点,所以输出到网络(虚拟链路)
socketOut.println(keyLine);
}
}
catch(UnknownHostException uex){
uex.printStackTrace();
}
catch(IOException iex){
iex.printStackTrace();
}
}
}
Server.java
import java.net.Socket;
import java.net.ServerSocket;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
public class Server{
public static void main(String[] args){
try{
ServerSocket serverSocket = new ServerSocket(2013); //监听端口2013
while(true){
Socket clientFromCocket = serverSocket.accept(); //阻塞线程,返回一个接收到的客户端Socket
new Thread(new ServerThread(clientFromCocket)).start(); //包装并开启新线程
}
}
catch(IOException ioex){
ioex.printStackTrace();
}
}
}
/*****Socket线程*****/
class ServerThread implements Runnable{
/*
* 提供构造器
* 注意:实现Runnable接口,重写一个 run() 方法 ,这个run()方法就是线程执行体;
* —— 该run()方法没有返回值,不能抛出异常
* —— 需要将 Runnable对象包装成 Thread对象之后再启动
*/
private Socket socket;
public ServerThread(Socket socket){
this.socket = socket;
}
@Override
public void run(){
try{
BufferedReader bf = new BufferedReader(
new InputStreamReader(socket.getInputStream())); //服务端字节输入流包装成缓冲流(过滤流)
String line = null;
while((line = bf.readLine()) != null){//获得输入
System.out.println("服务器:" + line);
}
//socket.close(); //通信完毕后关闭Socket及其关联的输入输出流
}
catch(IOException ex){
ex.printStackTrace();
}
}
}