Java tcp socket 通信

1.通信模型如下


2.代码如下:

server:

package com.nicholas.socket;

/*
 * 基于tcp的socket通信
 * 服务器端
 */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TestServerSocket {
	private ServerSocket serversocket = null;
	private Socket socket = null;
	private String info = null;

	public void TcpServer() {
		try {
			// 1.创建一个服务器端的socket->serversocket实例,绑定监听端口
			serversocket = new ServerSocket(12345);
			// 2.调用accept方法,监听客户端的连接
			socket = serversocket.accept();
			// 3.与客户端进行交互
			// 3.1 获取输入流,读取客户端的输入信息
			InputStream is = socket.getInputStream();// 字节输入流
			InputStreamReader isr = new InputStreamReader(is);// 将字节流包装为字符流
			BufferedReader br = new BufferedReader(isr);// 为输入流添加缓冲
			// 3.2循环读取客户端的信息
			while ((info = br.readLine()) != null) {
				System.out.println("This is server ,Client say " + info);
			}
			socket.shutdownInput();
			//4.获取输出流,响应客户端
			OutputStream os = socket.getOutputStream();
			PrintWriter pw = new PrintWriter(os);//包装成打印流
			pw.write("This is server to client!");
			pw.flush();
			// 5.关闭资源
			pw.close();
			os.close();

			br.close();
			isr.close();
			is.close();
			socket.close();
			serversocket.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		new TestServerSocket().TcpServer();
	}

}


client:

package com.nicholas.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 客户端
 * 
 * @author Nicholas
 * 
 */
public class TestSocket {
	private Socket socket = null;
	private String info = null;

	public void TcpClient() {
		try {
			// 1.创建客户端socket,指定服务器地址和端口
			socket = new Socket("localhost", 12345);
			// 2.获取输出流,向服务器发送信息
			OutputStream os = socket.getOutputStream();// 字节输出流
			PrintWriter pw = new PrintWriter(os);// 将输出流包装为打印流
			pw.write("This is a test from client !");
			pw.flush();// 刷新缓存

			socket.shutdownOutput();
			// 3.获取输入流,读取服务器的响应信息
			InputStream is = socket.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			while ((info = br.readLine()) != null) {
				System.out.println("This is Client ,server reply " + info);
			}
			br.close();
			is.close();
			pw.close();
			os.close();
			socket.close();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	public static void main(String[] args) {
		new TestSocket().TcpClient();
	}

}

3.注意

1)服务器端用输入流读取客户端的输入信息

2)客户端获取输出流,向服务器发送信息

3)服务器需要将获取的字节输入流包装为字符流,然后为字符流添加缓冲区,通过readline函数循环读入,读入完毕,调用socket的shutdownInput,终止获取

4)客户端需要将获取的字节输出流包装为字符打印流,通过write函数向服务器写入,输出完毕,调用socket的shutdownOutput,终止写入




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值