Socket通信有兩種主要方式:TCP協議和UDP協議,兩者區別是TCP協議要首先和接收方要建立連接然後發送數據,這樣數據能保證送達,但速度較慢;UDP協議首先把數據打包,然後直接發送到接收方,無需建立連接誒,速度快,但容易丟失數據。這裡是一個簡單的基於TCP協議的通信實例: 直接上代碼: 首先是j ...
Socket通信有兩種主要方式:TCP協議和UDP協議,兩者區別是TCP協議要首先和接收方要建立連接然後發送數據,這樣數據能保證送達,但速度較慢;UDP協議首先把數據打包,然後直接發送到接收方,無需建立連接誒,速度快,但容易丟失數據。這裡是一個簡單的基於TCP協議的通信實例:
直接上代碼:
首先是java伺服器的編寫:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class netserver { public static void main(String[] args) throws IOException { ServerSocket server=new ServerSocket(9090);//9090是埠號,由自己設置 System.out.println("伺服器已啟動"); Socket client=server.accept();//接收客戶端請求 // PrintStream out=new PrintStream(client.getOutputStream()); PrintWriter out=new PrintWriter(new OutputStreamWriter(client.getOutputStream(),"UTF-8"),true); BufferedReader msg=new BufferedReader(new InputStreamReader(client.getInputStream(),"UTF-8"));//對緩衝區數據讀取 StringBuffer info=new StringBuffer();//接收客戶端發來的消息 info.append("I'm fine.你好! ");//回應的數據 info.append(msg.readLine());//接收的數據 System.out.println(info);//控制台輸出將要發出的信息 out.print(info);//發送到客戶端 out.close(); msg.close(); client.close(); server.close(); } }
接下來是安卓客戶端的代碼:
package com.example.scoket; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; public class MainActivity extends AppCompatActivity { private Button send=null; private TextView info=null; private Handler handler=null; private String s=""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); send=(Button)findViewById(R.id.send); info=(TextView) findViewById(R.id.info); send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread() { public void run(){ try { Socket client=new Socket("10.0.2.2",9090);//括弧內為(伺服器,埠號) PrintStream out=new PrintStream(client.getOutputStream()); BufferedReader msgget=new BufferedReader(new InputStreamReader(client.getInputStream(),"UTF-8"));//讀取返回的數據 out.println("已連接伺服器"); s=msgget.readLine(); out.close(); msgget.close(); client.close(); } catch (Exception e) { e.printStackTrace(); } handler.sendEmptyMessage(0);}}.start(); handler =new Handler() { //當有消息發來的時候就執行Handler方法 public void handleMessage(Message msg) { super.handleMessage(msg); info.setText(s); } }; } }); } }
伺服器就填伺服器的ip地址,如果伺服器是在自己電腦上的,客戶端在虛擬機上,那麼伺服器就填10.0.2.2,若是區域網連接的,就用在win+r >cmd>config查詢一下電腦的ip;埠號必須與伺服器一致,挑選的埠如果顯示被占用就換一個,埠的取值就自行百度。
運行時先啟動伺服器,在運行客戶端
運行效果:
客戶端+伺服器控制台
按鈕點擊前:
點擊後: