Java Socket编程(二) TCP编程
服务 上一章节提到了TCP协议的相关内容。下面使用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(); } }
先运行客户端,然后运行服务端的话就会报错!很好理解,如果你没有服务端,客户端去连接谁呢?
先运行服务端,再运行客户端,我们就能得到从客户端发往服务端的信息了
附:
想继续深入可以看下下面这篇文章。转自itliucheng
仅自己学习复习记录使用,文章内容除自己理解外多为其他网络文章收集整理,侵删。