Socket,Thread,多线程Socket

1.Socket

Java的服务端和客户端编写都非常简单,创建服务端使用的是ServerSocket的,然后使用accept()的方法进行监听,并返回一个Socket的对象。客户端的话直接使用Socket类进行连接服务端。连接就这么简单。但我个人觉得难点在于传输信息上,Java本来封装好了很多输入输出流来方便程序员调用,但它的类的初始化中在嵌套各类的方法就觉得恶心了,对于初学者很难马上掌握。而我是这样理解的,Socket下我们通过getInputStream()方法来获得信息,通过getOutputSteram()方法来发送信息。

 

下面我们简单的实现一个单向的,客户端向服务端发送信息,只能单个连接的简单网络程序,最主要是来感受一下Java中的网络编程。

 

服务端

 

 

[java] view plaincopy
  1. package src;  
  2.   
  3. import java.io.*;  
  4. import java.net.*;  
  5.   
  6. /** 
  7.  * Server 
  8.  *  
  9.  * @author heqichang 服务端 
  10.  *  
  11.  * */  
  12. public class Server {  
  13.   
  14.     public static void main(String[] args) {  
  15.         try {  
  16.             // 创建一个服务端,绑定在8899端口  
  17.             ServerSocket serverSocket = new ServerSocket(8899);  
  18.   
  19.             // 开始在服务端开始监听  
  20.             Socket socket = serverSocket.accept();  
  21.   
  22.             // 定义一个流来接收信息  
  23.             BufferedReader br = new BufferedReader(new InputStreamReader(socket  
  24.                     .getInputStream()));  
  25.   
  26.             while (true) {  
  27.                 //利用循环来不断输出获得的信息  
  28.                 System.out.println(br.readLine());  
  29.             }  
  30.         } catch (IOException e) {  
  31.             // TODO Auto-generated catch block  
  32.             e.printStackTrace();  
  33.         }  
  34.     }  
  35. }  

 

客户端

[java] view plaincopy
  1. package src;  
  2.   
  3. import java.io.*;  
  4. import java.net.*;  
  5.   
  6. /** 
  7.  * Client 
  8.  *  
  9.  * @author heqichang 客户端 
  10.  *  
  11.  * */  
  12. public class Client {  
  13.   
  14.     public static void main(String[] args) {  
  15.         try {  
  16.             // 向本地的8899发出客户连接  
  17.             Socket socket = new Socket("127.0.0.1"8899);  
  18.   
  19.             //定义一个从标准输入设备输入的流  
  20.             BufferedReader br = new BufferedReader(new InputStreamReader(  
  21.                     System.in));  
  22.               
  23.             //发送的流  
  24.             PrintWriter pw = new PrintWriter(socket.getOutputStream());  
  25.   
  26.             while (true) {  
  27.                   
  28.                 //循环发送信息给服务端  
  29.                 pw.println(br.readLine());  
  30.                   
  31.                 //不要忘记最重要的刷新  
  32.                 pw.flush();  
  33.             }  
  34.         } catch (UnknownHostException e) {  
  35.             // TODO Auto-generated catch block  
  36.             e.printStackTrace();  
  37.         } catch (IOException e) {  
  38.             // TODO Auto-generated catch block  
  39.             e.printStackTrace();  
  40.         }  
  41.   
  42.     }  
  43. }  

 

自己上面所写的例子不怎么好,没有将连接进行关闭的操作。

以后自己再完善。

 

2.Thread

在Java语言中实现多线程有两种方法,第一种继承Thread类,重载Run()的方法,并用Start()方法进行调用。但上述这种方法在你需要继承其它类的情况下就不能使用了。第二种方法是实现Runnable的接口。下面都来演示一下代码如何实现。

第一种,继承Thread方法

[java] view plaincopy
  1. package src;  
  2.   
  3. /** 
  4.  *  
  5.  * @author heqichang 
  6.  *  
  7.  * */  
  8. public class ThreadRun extends Thread {  
  9.     private int num;  
  10.   
  11.     public ThreadRun(int i) {  
  12.         num = i;  
  13.     }  
  14.   
  15.     public void run() {  
  16.         System.out.println(num);  
  17.     }  
  18.   
  19.     public static void main(String[] args) {  
  20.         for (int i = 0; i < 3; i++) {  
  21.             ThreadRun thread = new ThreadRun(i);  
  22.             thread.start();  
  23.         }  
  24.     }  
  25. }  

第二种,实现Runnable接口方法

[java] view plaincopy
  1. package src;  
  2.   
  3. /** 
  4.  *  
  5.  * @author heqichang 
  6.  *  
  7.  * */  
  8. public class Run implements Runnable {  
  9.   
  10.     private int num;  
  11.   
  12.     public Run(int i) {  
  13.         num = i;  
  14.     }  
  15.   
  16.     @Override  
  17.     public void run() {  
  18.         System.out.println(num);  
  19.     }  
  20.   
  21.     public static void main(String[] args) {  
  22.         for (int i = 0; i < 3; i++) {  
  23.             new Thread(new Run(i)).start();  
  24.         }  
  25.     }  
  26. }  

3.下面我们来结合多线程和SOCKET来编写一个可以实现多连接服务端的程序

服务端程序如下:

[java] view plaincopy
  1. import java.io.*;  
  2. import java.net.*;  
  3.   
  4. /** 
  5.  *  
  6.  * @author heqichang 
  7.  * 服务端 
  8.  * */  
  9. public class ThreadSocketServer extends Thread {  
  10.   
  11.     Socket server;  
  12.       
  13.     //保存服务端的姓名  
  14.     static String name = new String();  
  15.   
  16.     public void run() {  
  17.         try {  
  18.               
  19.             //启动一个线程来接收客户端信息  
  20.             ThreadServer thread = new ThreadServer(server);  
  21.             thread.start();  
  22.   
  23.             BufferedReader br = new BufferedReader(new InputStreamReader(  
  24.                     System.in));  
  25.             PrintWriter pw = new PrintWriter(server.getOutputStream());  
  26.               
  27.             //第一次发送自己的姓名给客户端  
  28.             pw.println(name);  
  29.               
  30.             //循环发送信息给客户端  
  31.             while (true) {  
  32.                 String s = br.readLine();  
  33.                 pw.println(s);  
  34.                 pw.flush();  
  35.             }  
  36.         } catch (IOException e) {  
  37.             e.printStackTrace();  
  38.         }  
  39.   
  40.     }  
  41.   
  42.     public ThreadSocketServer(Socket s) {  
  43.         this.server = s;  
  44.     }  
  45.   
  46.     public static void main(String[] args) throws IOException {  
  47.           
  48.         //绑定服务端在9999端口  
  49.         ServerSocket server = new ServerSocket(9999);  
  50.         Socket socket;  
  51.   
  52.         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
  53.         System.out.print("请输入您的姓名:>");  
  54.         name = br.readLine();  
  55.   
  56.         while (true) {  
  57.               
  58.             //监听客户端程序  
  59.             socket = server.accept();  
  60.               
  61.             //一个客户端连接后启动一个线程进行处理  
  62.             ThreadSocketServer thread = new ThreadSocketServer(socket);  
  63.             thread.start();  
  64.         }  
  65.     }  
  66. }  

[java] view plaincopy
  1. import java.io.*;  
  2. import java.net.*;  
  3.   
  4. /** 
  5.  *  
  6.  * @author heqichang 
  7.  * 服务端接收信息线程 
  8.  * */  
  9. public class ThreadServer extends Thread{  
  10.       
  11.     Socket serverSocket;  
  12.       
  13.     public void run()  
  14.     {  
  15.         try {  
  16.             BufferedReader br=new BufferedReader(new InputStreamReader(serverSocket.getInputStream()));  
  17.             String read=new String();  
  18.               
  19.             //接受客户端的姓名信息  
  20.             String name=br.readLine();  
  21.               
  22.             //循环接受客户端信息  
  23.             while(true)  
  24.             {  
  25.                 read=br.readLine();  
  26.                 System.out.println(name+"说:"+read);  
  27.                   
  28.                 if(read.equals("bye"))  
  29.                 {  
  30.                     break;  
  31.                 }  
  32.             }  
  33.               
  34.             br.close();  
  35.             serverSocket.close();  
  36.               
  37.         } catch (IOException e) {  
  38.             // TODO Auto-generated catch block  
  39.             e.printStackTrace();  
  40.         }  
  41.     }  
  42.       
  43.     public ThreadServer(Socket server)  
  44.     {  
  45.         serverSocket=server;  
  46.     }  
  47. }  

客户端程序:

[java] view plaincopy
  1. import java.io.*;  
  2. import java.net.*;  
  3. /** 
  4.  *  
  5.  * @author heqichang 
  6.  * 客户端 
  7.  * */  
  8. public class ThreadSocketClient extends Thread{  
  9.       
  10.     static Socket socket;  
  11.       
  12.     public void run()  
  13.     {  
  14.         try {  
  15.             BufferedReader br2=new BufferedReader(new InputStreamReader(socket.getInputStream()));  
  16.             String read=new String();  
  17.               
  18.             //接受来自服务端的姓名信息  
  19.             String name=br2.readLine();  
  20.               
  21.             //接受来自服务端的信息  
  22.             while(true)  
  23.             {  
  24.                 read=br2.readLine();  
  25.                 System.out.println(name+"说:"+read);  
  26.             }  
  27.               
  28.         } catch (IOException e) {  
  29.             e.printStackTrace();  
  30.         }  
  31.     }  
  32.        
  33.       
  34.     public static void main(String[] args) throws IOException  
  35.     {  
  36.         socket=new Socket("127.0.0.1",9999);  
  37.           
  38.         BufferedReader inputName=new BufferedReader(new InputStreamReader(System.in));  
  39.           
  40.         System.out.print("已连接上服务端,请输入你的姓名:");  
  41.         String name=inputName.readLine();  
  42.           
  43.         //启动一个线程进行接收服务端信息  
  44.         ThreadSocketClient thread=new ThreadSocketClient();  
  45.         thread.start();  
  46.           
  47.         BufferedReader br=new BufferedReader(new InputStreamReader(System.in));  
  48.         PrintWriter pw=new PrintWriter(socket.getOutputStream());  
  49.           
  50.         //发送给服务端客户端的姓名信息  
  51.         pw.println(name);  
  52.           
  53.         String info=new String();  
  54.           
  55.         //发送消息给服务端  
  56.         while(!info.equals("bye"))  
  57.         {  
  58.             info=br.readLine();  
  59.             pw.println(info);  
  60.             pw.flush();  
  61.         }  
  62.           
  63.         pw.close();  
  64.         socket.close();  
  65.     }  
  66. }  

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值