Socket的用法
首先要建立服务器端,进行监听,然后建立客户端.
服务器端的建立
继承线程类
- 监听指定端口.
- 用while循环进行持续监听
- 如果侦测到监听则显示提示
代码示例:
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 }
客户端
- 创建带有socket的对象的chatSocket类
- 创建管理socket对象的manageSocket类
- 当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 }
坚持做好每件事,然后再做下一件。