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,终止写入