Java Socket(套接字)编程、TCP和UDP通信过程详解

网路上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端被称为一个Socket。Socket也被称为套接字,可以用来实现不同虚拟机或不同计算机之间的通信。在Java语言中,Socket可以分为两种类型,面向连接的Socket通信协议(TCP,Transmission Control Protocol,传输控制协议)和面向无连接的Socket通信协议(UDP,User Datagram Protocol,用户数据报协议)。任何一个Socket都是由IP地址和端口号唯一确定的,如下图所示:



基于TCP的通信过程如下:首先,Server(服务器)端Listen(监听)指定的某个端口(建议使用大于1024的端口)是否有连接请求;其次,Client(客户)端向Server端发出Connect(连接)请求;最后,Server端向Client端发回Accept(接受消息)。一个连接就建立起来了,会话随即产生。Server端和Client端都可以通过Send、Write等方法与对方通信。


而UDP提供了无连接通信,且不对传送数据包进行可靠性保证,适合于一次传输少量数据,UDP传输的可靠性由应用层负责。UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。但是正因为UDP协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等。


Socket的生命周期可以分为3个阶段:打开Socket、使用Socket收发数据和关闭Socket。在Java语言中,可以使用ServerSocket来作为服务器端,Socket来作为客户端来实现网络通信。


问题描述:用Socket实现客户端与服务器端的通信,要求客户发送数据后能够回显相同的数据。

参考答案:首先,创建一个名为Server.java的服务器端代码,如下所示:

package com.js.socketDemo;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 服务器类
 * @author JiangShuai
 *
 */
public class Server {
	public static void main(String[] args){
		BufferedReader br = null;
		PrintWriter pw = null;
		try{
			ServerSocket server = new ServerSocket(2000);
			Socket socket = server.accept();
			//获取输入流
			br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			//获取输出流
			pw = new PrintWriter(socket.getOutputStream(),true);
			String s = br.readLine();
			pw.println(s);
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try{
				br.close();
				pw.close();
			}catch(Exception e){
				
			}
		}
	}
}

其次,再创建一个Client.java的客户端程序,如下所示:

package com.js.socketDemo;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

/**
 * 客户端类
 * @author JiangShuai
 *
 */
public class Client {
	public static void main(String[] args) {
		BufferedReader br = null;
		PrintWriter pw = null;
		try {
			Socket socket = new Socket("localhost",2000);
			//获取输入流、输出流
			br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			pw = new PrintWriter(socket.getOutputStream(),true);
			//向服务器发送数据
			pw.println("Hello");
			String s = null;
			while(true){
				s = br.readLine();
				if(s!=null)
					break;
			}
			System.out.println(s);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				br.close();
				pw.close();
			} catch (Exception e2) {
			
			}
		}
	}

}


最后启动服务器端程序,然后运行客户端程序,客户端将会把从服务器端转发过来的“Hello”打印出来。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值