Java Socket 编程学习之 TCP

本文详细阐述了TCP通信的基本原理,包括TCPClient和TCPServer的实现方式,并提供了实例程序来展示如何简单地建立连接及进行通信。文章还介绍了如何在Client端通过Socket实例与Server端进行交互,以及在Server端如何监听连接并响应客户端请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值