本案例是实现编写客户端负责发送内容、服务器端用来接收内容的程序。

1.编写服务器端程序(hello.java)

该程序是负责接收数据,需要单独编译运行。可以采用eclipse编译,编译之后将文件保存在d盘。

如若存在c盘,可能会因为没有权限,命令提示符而不能正常执行。

public class hello implements Runnable {
    public static final String Server_ip="填写自己电脑的IP地址";
    public static final int Server_port=4000;//填写电脑内未被占用的端口号
    public void run() {
        System.out.println("S:Connectioning...");
        try{
            ServerSocket serverSocket=new ServerSocket(Server_port);
            while(true){
                Socket client=serverSocket.accept();
                System.out.println("S:Receing...");
                try {
                    BufferedReader breader=new BufferedReader(new InputStreamReader(client.getInputStream()));
                    String str=breader.readLine();
                    System.out.println("S:Received:"+str);
                } catch (Exception e) {
                    System.out.println("S:ERROR");
                    e.printStackTrace();
                }finally {
                    client.close();
                    System.out.println("S:Done");
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Thread thread=new Thread(new hello());
        thread.start();
    }
}

上述代码中设置服务器端口为4000,然后通过 accept ()方法使服务器开始监听客户端的连接,然后通过 BufferReader 对象来接收输人流。最后关闭 Socket 和流。

2,编写客户端布局

文件客户端布局界面包含一个 EditText 组件和一个按钮,按钮负责把输人的内容发送到服务器端。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <EditText
        android:id="@+id/mes"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入要发送的消息" />

    <Button
        android:id="@+id/send"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送消息" />
</LinearLayout>

 2.编写 MainActivity 代码 

MainActivity 负责客户端的实现,在按钮事件中通过“ socket = new Socket ( ip ,port )” 请求连接服务器,并通过 BufferedWriter 发送消息。

public class MainActivity extends AppCompatActivity {
    private EditText mes;
    private Button send_btn;
    private String ip="自己电脑的IP地址";
    private int port=4000;//电脑内未被占用的端口号
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout);
        if(Build.VERSION.SDK_INT>8){
            StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }
        init();
    }
    public void init(){
        mes=(EditText) findViewById(R.id.mes);
        send_btn=(Button) findViewById(R.id.send);
        send_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    String string=mes.getText().toString();
                    if(!TextUtils.isEmpty(string)){
                        SendMes(ip,port,string);
                    }
                    else{
                        Toast.makeText(MainActivity.this, "请先输入内容", Toast.LENGTH_SHORT).show();
                        mes.requestFocus();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    private void SendMes(String ip,int port,String mes) throws UnknownHostException, IOException {
        try {
            Socket socket=null;
            socket=new Socket(ip,port);
            BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            writer.write(mes);
            writer.flush();
            writer.close();
            socket.close();
        }catch (UnknownHostException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

4.添加网络权限

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

5.运行运行程序,输入要发送的消息,然后单击“发送消息”按钮,出现的结果。

                  

客户端与服务器端连接成功并且发送了消息。这就是 Socket 通信的具体步骤,开发者可以使用 Socket 通信开发一些更为复杂的应用。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐