Java网络编程

.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都会以一个线程的方式运行,这样无论有多少个客户连接都可以同时完成操作。

未完待续。。。

 

posted @ 2015-07-17 11:07  米兰_跳跳虎  阅读(324)  评论(0编辑  收藏  举报