首页 > 学院 > 开发设计 > 正文

Java网络编程

2019-11-15 00:54:27
字体:
来源:转载
供稿:网友
java网络编程

.TCP程序设计

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

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

.ServerSocket类的常用方法

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

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

.Socket类的常用方法:

序号方法类型描述
1public Socket(String host , int port)throws UnknownHostException,IOException构造构造Socket对象,同时指定要连接服务器的主机名及连接端口号。
2public InputStream getInputStream() throws IOException普通返回此套接字的输入流
3public OutputStream getOutputStream() throws IOException返回此套接字的输出流
4public void close() throws IOException关闭此Socket
5public 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都会以一个线程的方式运行,这样无论有多少个客户连接都可以同时完成操作。

未完待续。。。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表