博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java网络编程
阅读量:6900 次
发布时间:2019-06-27

本文共 5287 字,大约阅读时间需要 17 分钟。

.TCP程序设计

在JAVA中使用Socket(即套接字)完成TCP程序的开发,使用此类可以方便的建立可靠的,双向的,持续的,点对点的通信连接。

在Socket的程序开发中,服务器端使用ServerSocke等待客户端的连接,对于java的网络程序来讲,每一个客户端都使用一个Socket对象表示。

.ServerSocket类的常用方法

序号 方法 类型 描述
1 public ServerSocket(int port)throws IOException 构造函数 创建ServerSocket实例,并监听指定的端口。
2 public Socket accept()throws IOException 普通函数 等待客户端连接,此方法连接之前一直阻塞
3 public InetAddress getInetAddress() 普通函数 返回服务器的IP地址
4 public boolean isClosed() 普通函数 返回ServerSocket的关闭状态
5 public void close()throws IOException 普通函数 关闭ServerSocket

在服务器端每次运行时都要使用accept()方法等待客户端连接,此方法执行之后服务器端将进入阻塞状态,直到客户端连接之后程序才可以向下继续执行。此方法的返回值类型是Socket,每一个Socket都表示一个客户端对象。

.Socket类的常用方法:

序号 方法 类型 描述
1 public Socket(String host , int port)throws UnknownHostException,IOException 构造 构造Socket对象,同时指定要连接服务器的主机名及连接端口号。
2 public InputStream getInputStream() throws IOException 普通 返回此套接字的输入流
3 public OutputStream getOutputStream() throws IOException   返回此套接字的输出流
4 public void close() throws IOException   关闭此Socket
5 public boolean isClosed()   判断此套接字是否被关闭

            

.第一个TCP程序--Echo程序

      Echo 程序是一个网络编程通信交互的一个典型的案例,称为回应程序,即客户端输入哪些内容,服务器端会在这些内容前加上“ECHO:”并将信息发回客户端。

      之前的程序代码,服务器端每次执行完毕后,服务器都会退出,这是因为服务器端只能接受一个客户端的连接,主要是由于accept()方法只能使用一次,本程序中将通过

循环的方法使用accept()方法,这样,每一个客户端执行完毕后,服务器端都可以重新等待用户连接。

单线程范例:

EchoClient
1 public class EchoClient { 2     public static void main(String[] args) throws IOException { 3  4         Socket client = new Socket("localhost", 8888); 5         BufferedReader buf = null; 6         PrintStream out = null; 7         out = new PrintStream(client.getOutputStream()); 8         out.println(1); 9         BufferedReader input = null;10         input = new BufferedReader(new InputStreamReader(System.in));11         buf = new BufferedReader(new InputStreamReader(client.getInputStream()));12         boolean flag = true;13 14         while (flag) {15             System.out.println("Please Key In:");16             String str = input.readLine();17             out.println(str);18             if ("bye".equals(str)) {19                 flag = false;20             } else {21                 String echo = buf.readLine();22 23                 System.out.println("1111" + echo);24             }25         }26         client.close();27         buf.close();28     }29 }

单线程范例:

EchoServer
1 public class EchoServer { 2     public static void main(String[] args) throws IOException { 3         ServerSocket server = null; 4         Socket client = null; 5         PrintStream out = null; 6         BufferedReader buf = null; 7         server = new ServerSocket(8888); 8         boolean f = true; 9         while (f) {10             System.out.println("Server Running,Waiting for Client");11             client = server.accept();12             out = new PrintStream(client.getOutputStream());13             // 获取客户端输入的信息14             buf = new BufferedReader(new InputStreamReader(15                     client.getInputStream()));16             // 实例化输出端17             out = new PrintStream(client.getOutputStream());18             boolean flag = true;19             while (flag) {20                 String str = buf.readLine();21                 if (str == null || "".equals(str)) {22                     flag = false;23                 } else {24                     if ("bye".equals(str)) {25                         flag = false;26                     } else {27                         out.println("ECHO" + str);28                     }29                 }30             }31             out.close();32             client.close();33         }34         server.close();35     }36 37 }

多线程范例:

EchoThread
1 public class EchoThread implements Runnable { 2  3     private Socket client = null; 4  5     public EchoThread(Socket client) { 6         this.client = client; 7     } 8  9     public void run() {10         PrintStream out = null;11         BufferedReader buf = null;12 13         try {14             buf = new BufferedReader(new InputStreamReader(15                     client.getInputStream()));16             out = new PrintStream(client.getOutputStream());17             boolean flag = true;18 19             while (flag) {20                 String str = buf.readLine();21                 if (str == null || "".equals(str)) {22                     flag = false;23                 } else {24                     if ("bye".equals(str)) {25                         flag = false;26                     } else {27                         out.println("ECHO:" + str);28                     }29                 }30             }31             out.close();32             client.close();33         } catch (Exception e) {34         }35     }36 37 }

多线程范例:

EchoServer
1 public class EchoServer { 2     public static void main(String[] args) throws IOException { 3         ServerSocket server = null; 4         Socket client = null; 5         PrintStream out = null; 6         BufferedReader buf = null; 7         server = new ServerSocket(8888); 8         boolean f = true; 9         while (f) {10             System.out.println("Server Running,Waiting for Client");11             client = server.accept();12             new Thread(new EchoThread(client)).start();13             14         }15         server.close();16     }17 18 }

在服务器端,每一个连接到服务器的客户端Socket都会以一个线程的方式运行,这样无论有多少个客户连接都可以同时完成操作。

未完待续。。。

 

转载于:https://www.cnblogs.com/meiCode/p/4653841.html

你可能感兴趣的文章
[洛谷P4245]【模板】任意模数NTT
查看>>
iOS开发-面试总结(十六)
查看>>
[LeetCode] Unique Binary Search Trees II dfs 深度搜索
查看>>
升级Mac OS X上的git
查看>>
python基础2(数据类型、数据运算、for循环、while循环、列表)
查看>>
应用被强杀了怎么办
查看>>
jquery validate 插件使用心得
查看>>
Windows下安装mysql后,不知道root密码,如果修改root密码
查看>>
Linuxドライバ_LDD3メモ_ハードウェアとの通信
查看>>
数学之美系列四 -- 怎样度量信息?
查看>>
用Access+SharePoint 来收集数据
查看>>
Nginx 的 Location 配置指令块
查看>>
Spark小课堂Week5 Scala初探
查看>>
go练习1-翻转字符串
查看>>
java第一天学习笔记
查看>>
GPS定位为什么要转换处理?高德地图和百度地图坐标处理有什么不一样?
查看>>
简单代码在ABAP中实现声音的播放
查看>>
冲刺博客 五
查看>>
poj 2389 大整数乘法
查看>>
redis数据类型
查看>>