Java Socket的有关TCP简单使用

本文深入解析Socket通信的基本概念,区分TCP与UDP协议特点,详细介绍基于Java的Socket编程实践,包括ServerSocket与Socket对象的使用,以及客户端与服务器端的数据交互流程。

类Socket的介绍

什么是网络通讯?

多台计算机连接在一起,并且在其之间有着数据的传输就是网络。

简单的来说就是:客户端,通讯连接,服务器。

Socket也称为套接字。客户端与服务器的连接必须创建一个Socket的对象,服务器的套接字为ServerSocket,客户端的套接字为Socket,Socket可以分为两种类型:面向连接的Socket通信协议(TCP)和无连接的Socket通信协议(UDP)。有关TCP和UDP的详细信息,可以参考计算机网络。基于TCP的Socket通信过程分为三个步骤:服务器监听、客户端请求、连接确认。

服务器端程序调用ServerSocket.accept方法等待客户端的连接请求,一旦accept接收了客户端连接请求,该方法返回一个与该客户端建立了专线连接的Socket对象,不用程序去创建这个Socket对象。建立了连接的两个Socket是以IO流的方式进行数据交换的,Java提供了Socket.getInputStream返回Socket的输入流对象,Socket.getOutputStream返回Socket的输出流对象。

ServerSocket服务器代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

	public static void main(String[] args) {
		ServerSocket server = null;
		Socket socket = null;
		InputStream is = null;
		InputStreamReader isr = null;
		BufferedReader br = null;
		try {
			//创建服务器,并监听8181的端口
			server = new ServerSocket(8181);
			System.out.println("等待客户端连接中...");
			//等待客户端连接,连接客户端的socket
			socket = server.accept();
			System.out.println("客户端的IP地址:" + socket.getInetAddress());
			System.out.println("客户端的端口号:" + socket.getPort());
			is = socket.getInputStream();
			isr = new InputStreamReader(is,"utf-8");//统一编码防止乱码产生
			br = new BufferedReader(isr);
                        //等待客户端不为exit的输入流
			while(true) {
				String str = br.readLine();
				if("exit".equals(str)) {
					break;
				}
				System.out.println(str);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				br.close();
				isr.close();
				is.close();
				socket.close();
				server.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

}

Client客户端:


import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

class Client {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		Socket socket = null;
		OutputStream os = null;
		OutputStreamWriter osw = null;
		try {
                        //创建客户端,并连接服务器,为方便测试填写的地址是“127.0.0.1”
			socket = new Socket("127.0.0.1",8181);
			os = socket.getOutputStream();
			osw = new OutputStreamWriter(os, "utf-8");
			
			String str = null;
			while(true) {
				System.out.print("请客户端输入:");
				str = scanner.nextLine();
				osw.write(str + "\n");
				osw.flush();
				if("exit".equals(str)) {
					break;
				}
			}
			
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				osw.close();
				os.close();
				socket.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值