服务 上一章节提到了TCP协议的相关内容。下面使用TCP在服务端及客户端之间进行传递消息。
三次握手 的方式建立连接,形成传输数据的通道,在连接中进行大量数据的传输,效率会稍低。
Java中基于TCP协议实现网络通信的类有
Socket类(客户端使用):当客户端程序需要从服务端端获取信息及其他服务时,应创建一个Socket对象
ServerSocket(服务端使用):一般用于服务端设置端口号和进行监听
真正进行通信的其实是客户端的Socket和服务端的Socket.
Socket通信的步骤
① 创建ServerSocket和Socket
② 打开连接到Socket的输入/输出流
③ 按照协议对Socket进行读/写操作
④ 关闭输入输出流、关闭Socket
服务器端:
① 创建ServerSocket对象,绑定监听端口
② 通过accept()方法监听客户端请求
③ 连接建立后,通过输入流读取客户端发送的请求信息
④ 通过输出流向客户端发送相应信息
⑤ 关闭相关资源
package test;
import java.io.BufferedReader;
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 SocketServer {
public static void main(String[] args) throws Exception {
int port = 55521;//指定端口
ServerSocket server = new ServerSocket(port);//ServerSocket用于服务器端socket,指定绑定的端口,并监听此端口
System.out.println("等待连接");
Socket socket = server.accept();//调用accept()方法开始监听,等待客户端的连接
InputStream inputStream = socket.getInputStream();//建立好连接,从socket中获取输入流
InputStreamReader isr = new InputStreamReader(inputStream,"UTF-8");
BufferedReader br = new BufferedReader(isr);//建立缓冲,提高效率
String info = null;
while((info = br.readLine()) != null) {
System.out.println("Server on:" + info);
}
socket.shutdownInput();
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);//PrintWriter 是字符类型的打印输出流
pw.write("欢迎您!你好");
pw.flush();
pw.close();
os.close();
isr.close();
inputStream.close();
server.close();
socket.close();
}
}
客户端
① 创建Socket对象,指明需要连接的服务器的地址和端口号
② 连接建立后,通过输出流想服务器端发送请求信息
③ 通过输入流获取服务器响应的信息
④ 关闭响应资源
package test;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
public class SocketClient {
public static void main(String[] args) throws Exception {
String host = "127.0.0.1";
int port = 55521;
Socket socket = new Socket(host,port);
OutputStream outputStream = socket.getOutputStream();
PrintWriter pw = new PrintWriter(outputStream);
pw.write("用户名:admin 密码:123");
pw.flush();
socket.shutdownOutput();
InputStream inputStream = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
String info = null;
while((info = br.readLine()) != null) {
System.out.println("从服务端获取的消息:" + info);
}
br.close();
inputStream.close();
outputStream.close();
socket.close();
pw.close();
}
}
先运行客户端,然后运行服务端的话就会报错!很好理解,如果你没有服务端,客户端去连接谁呢?
先运行服务端,再运行客户端,我们就能得到从客户端发往服务端的信息了