Server端代碼java
用來實現客戶端socket的監聽android
1 package MyServer; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.IOException; 6 import java.io.InputStreamReader; 7 import java.io.OutputStreamWriter; 8 import java.net.ServerSocket; 9 import java.net.Socket; 10 import java.util.Vector; 11 12 import javax.swing.JOptionPane; 13 14 public class MyServerSocket 15 { 16 private Vector<ChatSocket> vector=new Vector<ChatSocket>();//存放全部的客戶端socket 17 public MyServerSocket() 18 { 19 try 20 { 21 ServerSocket serverSocket=new ServerSocket(13345);//服務端開啓對端口13345的監聽 22 while(true) 23 { 24 Socket socket=serverSocket.accept();//服務器端提供與客戶端相對應的socket 25 JOptionPane.showMessageDialog(null, "已經有客戶端連入"); 26 ChatSocket cs=new ChatSocket(socket,vector);//對每個客戶端都提供一個ChatSocket類來進行信息的交互 27 add(cs); 28 cs.start(); 29 } 30 } catch (IOException e) 31 { 32 // TODO 自動生成的 catch 塊 33 e.printStackTrace(); 34 } 35 } 36 public void add(ChatSocket csSocket)//服務器端添加每個客戶端socket 37 { 38 vector.add(csSocket); 39 } 40 public static void main(String[]args) 41 { 42 new MyServerSocket(); 43 } 44 }
ChatSocket類,繼承Thread線程類,進行與每一個客戶端進行信息交互的任務服務器
1 package MyServer; 2 3 import java.io.BufferedOutputStream; 4 import java.io.BufferedReader; 5 import java.io.BufferedWriter; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.io.InputStreamReader; 9 import java.io.OutputStream; 10 import java.io.OutputStreamWriter; 11 import java.io.UnsupportedEncodingException; 12 import java.net.Socket; 13 import java.nio.Buffer; 14 import java.util.Vector; 15 16 import javax.swing.text.AbstractDocument.BranchElement; 17 /** 18 * 19 * @author hcc 20 *客戶端與服務端進行信息交互的Chat類 21 */ 22 public class ChatSocket extends Thread 23 { 24 Socket socket; 25 Vector<ChatSocket>vector; 26 public ChatSocket(Socket s,Vector<ChatSocket>vector) 27 { 28 this.socket=s; 29 this.vector = vector; 30 } 31 public void out(String out)//服務器發送消息給客戶端 32 { 33 try 34 { 35 BufferedWriter bfWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 36 bfWriter.write(out+"\n"); 37 bfWriter.flush();//清空緩衝區,避免消息延遲顯示 38 } catch (UnsupportedEncodingException e) 39 { 40 // TODO 自動生成的 catch 塊 41 e.printStackTrace(); 42 } catch (IOException e) 43 { 44 // TODO 自動生成的 catch 塊 45 e.printStackTrace(); 46 } 47 } 48 @Override 49 public void run() 50 { 51 try 52 { 53 BufferedReader bufferedReader=new BufferedReader( 54 new InputStreamReader( 55 socket.getInputStream())); 56 String line = null; 57 while((line=bufferedReader.readLine())!=null)//服務端接收客戶端的消息 58 { 59 sendMessage(this, line);//轉發給其餘客戶端 60 System.out.println(line); 61 } 62 bufferedReader.close(); 63 } catch (IOException e) 64 { 65 // TODO 自動生成的 catch 塊 66 e.printStackTrace(); 67 } 68 } 69 public void sendMessage(ChatSocket cs,String out) 70 { 71 for(int i=0;i<vector.size();i++) 72 { 73 ChatSocket csChatSocket=vector.get(i); 74 if(!cs.equals(csChatSocket))//將發送該消息的客戶端除外 75 { 76 csChatSocket.out(out); 77 } 78 } 79 } 80 81 }
android端的客戶端代碼app
1 package com.hcc.mysocketclient; 2 3 import android.os.AsyncTask; 4 import android.support.v7.app.AppCompatActivity; 5 import android.os.Bundle; 6 import android.text.Editable; 7 import android.view.View; 8 import android.widget.Button; 9 import android.widget.EditText; 10 import android.widget.TextView; 11 import android.widget.Toast; 12 13 import java.io.BufferedInputStream; 14 import java.io.BufferedReader; 15 import java.io.BufferedWriter; 16 import java.io.IOException; 17 import java.io.InputStreamReader; 18 import java.io.OutputStreamWriter; 19 import java.net.Socket; 20 import java.net.UnknownHostException; 21 import java.util.logging.SocketHandler; 22 23 public class MainActivity extends AppCompatActivity { 24 Button conBtn; 25 EditText ipText; 26 Button sendBtn; 27 EditText sendText; 28 TextView textView; 29 Socket clientSocket; 30 BufferedReader bfReader; 31 BufferedWriter bfWriter; 32 @Override 33 protected void onCreate(Bundle savedInstanceState) { 34 super.onCreate(savedInstanceState); 35 setContentView(R.layout.activity_main); 36 findViews(); 37 conBtn.setOnClickListener(new View.OnClickListener() { 38 @Override 39 public void onClick(View v) { 40 connect(); 41 } 42 }); 43 sendBtn.setOnClickListener(new View.OnClickListener() { 44 @Override 45 public void onClick(View v) { 46 send(); 47 } 48 }); 49 } 50 private void findViews(){ 51 conBtn = (Button)findViewById(R.id.con_btn); 52 sendBtn = (Button)findViewById(R.id.send_btn); 53 ipText = (EditText)findViewById(R.id.ip_text); 54 sendText = (EditText)findViewById(R.id.send_text); 55 textView = (TextView)findViewById(R.id.content_text); 56 } 57 private void connect(){ 58 AsyncTask<Void,String,Void> reader = new AsyncTask<Void, String, Void>() { 59 @Override 60 protected Void doInBackground(Void... params) { 61 try { 62 clientSocket = new Socket("10.62.37.152",13345);
//客戶端創建與服務端socket的鏈接,"10.62.37.152"爲個人局域網ip地址,讀者按照本身的ip地址進行相應修改 63 bfWriter = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())); 64 bfReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 65 } catch (IOException e) { 66 e.printStackTrace(); 67 } 68 try { 69 String line = "hello"; 70 while((line = bfReader.readLine())!=null){ 71 publishProgress(line);//接收從服務端轉發來的消息 72 } 73 } catch (IOException e) { 74 Toast.makeText(getApplicationContext(),"讀取消息失敗",Toast.LENGTH_LONG).show(); 75 e.printStackTrace(); 76 } 77 return null; 78 } 79 @Override 80 protected void onProgressUpdate(String... values) { 81 textView.append("別人說:" + values[0] + "\n"); 82 super.onProgressUpdate(values); 83 } 84 }; 85 reader.execute(); 86 }
//發送消息給服務端 87 private void send(){ 88 try { 89 textView.append("我說"+sendText.getText().toString()+"\n"); 90 bfWriter.write(sendText.getText().toString() + "\n"); 91 bfWriter.flush(); 92 } catch (IOException e) { 93 Toast.makeText(getApplicationContext(),"沒法創建鏈接",Toast.LENGTH_LONG).show(); 94 e.printStackTrace(); 95 } 96 } 97 }
xml文件socket
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" 6 tools:context=".MainActivity"> 7 <EditText 8 android:id="@+id/ip_text" 9 android:layout_width="match_parent" 10 android:layout_height="wrap_content" /> 11 <Button 12 android:id="@+id/con_btn" 13 android:text="Connect" 14 android:layout_width="wrap_content" 15 android:layout_height="wrap_content" /> 16 <TextView 17 android:layout_width="match_parent" 18 android:layout_height="280dp" 19 android:id="@+id/content_text"/> 20 <EditText 21 android:id="@+id/send_text" 22 android:layout_width="match_parent" 23 android:layout_height="wrap_content" /> 24 <Button 25 android:text="send" 26 android:id="@+id/send_btn" 27 android:layout_width="match_parent" 28 android:layout_height="wrap_content" /> 29 </LinearLayout>
最後的效果圖ide
客戶端可開啓兩個及以上的虛擬機進行客戶端的聊天this