JAVA网络编程之基于TCP的服务器端和客户端的简单实现

传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。

在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。

ServerSocket:此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。服务器套接字的实际工作由SocketImpl类的实例执行。应用程序可以更改创建套接字实现的套接字工厂来配置它自身,从而创建适合本地防火墙的套接字。

Socket:此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器之间的通信端点。套接字的实际工作由SocketImpl类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。

SocketAddress:此类表示不带任何协议附件的Socket Address。作为一个抽象类,应通过特定的、协议相关的实现为其创建子类。它提供不可变对象,供套接字用于绑定、连接或用作返回值。

TCP服务器端实现

package com.xieyincai.net;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class SimpleTCPServer {

	private final static int PORT = 8000;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		ServerSocket serverSocket = null;
		
		try {
			serverSocket = new ServerSocket(PORT);
			
			while(true) {
				Socket socket = serverSocket.accept();
				
				OutputStream out = socket.getOutputStream();
				InputStream in = socket.getInputStream();
				
				byte[] buffer = new byte[4096];
				int length = in.read(buffer);
				
				String data = new String(buffer, 0, length, "UTF-8");
				
				System.out.println("CLIENT:\t" + socket.getInetAddress() + " : " + socket.getPort() + "\t" + data);
				
				data = "ECHO:\t" + data;
				out.write(data.getBytes("UTF-8"));
				out.flush();
				
				socket.close();
			}
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				serverSocket.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

TCP客户端实现

package com.xieyincai.net;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;

public class SimpleTCPClient {

	private final static String HOSTNAME = "localhost";
	private final static int PORT = 8000;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Socket socket = new Socket();
		
		try {
			SocketAddress address = new InetSocketAddress(HOSTNAME, PORT);
			socket.connect(address);
			
			OutputStream out = socket.getOutputStream();
			InputStream in = socket.getInputStream();
			
			String data = String.valueOf(System.nanoTime());
			System.out.println(data);
			
			out.write(data.getBytes("UTF-8"));
			out.flush();
			
			byte[] buffer = new byte[4096];
			int length = in.read(buffer);
			String result = new String(buffer, 0, length, "UTF-8");
			
			System.out.println(result);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				socket.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

服务器端输出:

CLIENT:	/127.0.0.1 : 55683	59297620405401
CLIENT:	/127.0.0.1 : 55716	59304171339613
CLIENT:	/127.0.0.1 : 55738	59308897235198

客户端输出:

59308897235198
ECHO:	59308897235198

Leave a Reply

Your email address will not be published. Required fields are marked *