Socket的用法

首先要建立服务器端,进行监听,然后建立客户端.

 

服务器端的建立

继承线程类

  1. 监听指定端口.
  2. 用while循环进行持续监听
  3. 如果侦测到监听则显示提示

代码示例:

 1 import java.io.IOException;
 2 import java.net.ServerSocket;
 3 import java.net.Socket;
 4 
 5 import javax.swing.JOptionPane;
 6 
 7 public class ServerListener extends Thread {
 8     @Override
 9     public void run() {
10         
11         try{
12             //监听12345端口
13             ServerSocket serverSocket = new ServerSocket(12345);
14             while(true){
15             //将监听到的信息传给socket示例
16             Socket socket = serverSocket.accept();
17             JOptionPane.showMessageDialog(null, "有客户端连接到了本机");
18             //将socket传给新线程
19             ChatSocket cs = new ChatSocket(socket);
20             cs.start(); //创建socket并启动
21             ChatManager.getChatManager().add(cs);//将启动后的线程放入chatManage中管理.
22             }
23         }catch(IOException e){
24             e.printStackTrace();
25         }
26     }
27 }

 

 

客户端

  1. 创建带有socket的对象的chatSocket类
  2. 创建管理socket对象的manageSocket类
  3. 当chatSocket类连接成功后放入manageSocket类中管理

代码示例chatSocket类

 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStreamReader;
 4 import java.io.UnsupportedEncodingException;
 5 import java.net.Socket;
 6 /**
 7  * @author wangchi
 8  * 聊天对象实例,使用这个类,该类默认有一个socket对象 
 910  */
11 public class ChatSocket extends Thread {
12     
13     Socket socket;
14     
15     public ChatSocket(Socket s) {
16         this.socket = s;
17     }
18     //获取需要发送的信息装入socket中.
19     public void out(String out) {
20         try {
21             socket.getOutputStream().write(out.getBytes("UTF-8"));
22         } catch (UnsupportedEncodingException e) {
23             e.printStackTrace();
24         } catch (IOException e) {
25             e.printStackTrace();
26         }
27         
28     }
29     
30     @Override
31     public void run() {
32         
33   try {
34 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
35             String line = null;
36             while((line = br.readLine())!=null){
37                 ChatManager.getChatManager().publish(this, line);
38             }
39             br.close();
40         } catch (IOException e) {
41             e.printStackTrace();
42         }
43         while(true){
44             
45         }
46     
47     }
48 }

 代码示例ChatManager

import java.util.Vector;

//用来控制线程,使其可以相互通讯
public class ChatManager {
    // 单例化
    private ChatManager() {
    }
    private static final ChatManager cm = new ChatManager();
    //确保只能形成一个chatManager对象.(只能有一个调度台)
    public static ChatManager getChatManager() {
        return cm;
    }
//创建数组,用来存放连接成功的soket实例对象.
    Vector<ChatSocket> vector = new Vector<ChatSocket>();

    public void add(ChatSocket cs) {
        vector.add(cs);
    }
/**(
 * publish传送过来两个参数
 * @param cs 一个是ChatSocket对象
 * @param out 另一个是该对象准备发送的文字
 */
    public void publish(ChatSocket cs, String out) {
        for (int i = 0; i < vector.size(); i++) {
            ChatSocket csChatSocket = vector.get(i);
            if (!cs.equals(csChatSocket)) {
                csChatSocket.out(out);
            }
        }
    }
}

使用时应该先启动服务器端进行监听,然后动客户端.

 

Android上客户端的写法

 17 public class MainActivity extends Activity {
 18   //需要在main.xml文件中布局界面文件.
 19     EditText ip;
 20     EditText editText;
 21     TextView text;
 22 
 23     @Override
 24     protected void onCreate(Bundle savedInstanceState) {
 25         super.onCreate(savedInstanceState);
 26         setContentView(R.layout.activity_main);
 27 
 28         ip = (EditText) findViewById(R.id.ip);
 29         editText = (EditText) findViewById(R.id.edit);
 30         text = (TextView) findViewById(R.id.text);
 31 
 32         findViewById(R.id.connect).setOnClickListener(
 33                 new View.OnClickListener() {
 34 
 35                     @Override
 36                     public void onClick(View v) {
 37                         connect();
 38                     }
 39                 });
 40         findViewById(R.id.send).setOnClickListener(new View.OnClickListener() {
 41 
 42             @Override
 43             public void onClick(View v) {
 44                 send();
 45             }
 46         });
 47     }
 48 
 49     // ----------------------------上面都是按钮的监听,下面是真正的socket连接服务器的实现-------------
 50     Socket socket = null; //声明一个scoket对象
 51     //声明输入输出流
 52     BufferedWriter writer = null; 
 53     
 54     BufferedReader reader = null;
 55     /**
 56      * 连接服务器
 57      * 相关知识
 58      * 1.输入输出流
 59      * 2.异步通讯
 60      */
 61     public void connect() {
 62 
 63             /**
 64              * 异步执行,后台代码,用来监听接收数据,和发送数据.
 65              */
 66             AsyncTask<Void, String, Void> read = new AsyncTask<Void, String, Void>() {
 67                 @Override
 68                 protected Void doInBackground(Void... params) {
 69 
 70                     try {
 71                         socket = new Socket(ip.getText().toString(), 12345);
 72                         writer = new BufferedWriter(new OutputStreamWriter(
 73                                 socket.getOutputStream()));
 74                         reader = new BufferedReader(new InputStreamReader(
 75                                 socket.getInputStream()));
 76                         publishProgress("@success");
 77                     } catch (IOException e1) {
 78                    Toast.makeText(MainActivity.this, "无法建立连接", Toast.LENGTH_SHORT).how();
 79                     }
 80 
 81                     String line;
 82                     
 83                     try {
 84                         while ((line = reader.readLine()) != null) {
 85                             publishProgress(line);
 86                         }
 87                     } catch (IOException e) {
 88                         e.printStackTrace();
 89                     }
 90                     return null;
 91                 }
 92 
 93                 protected void onProgressUpdate(String[] values) {
 94                     Toast.makeText(MainActivity.this, "成功", Toast.LENGTH_SHORT).show();
 95                     text.append(values[0]);
 96                     super.onProgressUpdate(values);
 97                 }
 98             };
 99             read.execute(); //启动,接着就会被服务器监听到.
100         
101     }
102 /**
103  * 获取编辑框的内容.将其放入输出流中.
104  */
105     public void send() {
106         try {
107             text.append("I say:"+editText.getText().toString()+"\n");
108             writer.write(editText.getText().toString()+"\n");
109             writer.flush();
110             editText.setText("");
111         } catch (IOException e) {
112             e.printStackTrace();
113         }
114     }
115 
116 }

 

posted @ 2014-10-09 12:03  vwa  阅读(303)  评论(0编辑  收藏  举报