Android 使用socket实现简单的 客户端与服务端对话

首先是客户端想服务端发送信息

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


    <Button
        android:id="@+id/butConnect"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="40dp"
        android:gravity="center"
        android:text="连接服务器"
        android:textSize="20sp" />

    <Button
        android:id="@+id/butSend"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="40dp"
        android:gravity="center"
        android:text="发送消息"
        android:textSize="20sp" />


</LinearLayout>
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Socket socket;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        Button butConnect = findViewById(R.id.butConnect);
        Button butSend = findViewById(R.id.butSend);


        butConnect.setOnClickListener(this);
        butSend.setOnClickListener(this);


    }



    @Override
    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.butConnect:
                new Thread() {
                    @Override
                    public void run() {
                        try {
                            socket = new Socket("192.168.1.100", 9999);
                            Log.i("Android", "与服务器建立连接:" + socket);
                        } catch (UnknownHostException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }.start();

                break;

            case R.id.butSend:

                new Thread() {
                    @Override
                    public void run() {
                        try {
                            // socket.getInputStream()
                            DataOutputStream writer = new DataOutputStream(socket.getOutputStream());
                            writer.writeUTF("嘿嘿,你好啊,服务器.."); // 写一个UTF-8的信息
                            System.out.println("发送消息");
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }.start();

                break;


            default:
                break;
        }


    }

}

服务端 Java

apply plugin: 'java-library'

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
}

tasks.withType(JavaCompile){

    options.encoding = "UTF-8"}

sourceCompatibility = "7"
targetCompatibility = "7"
public class ServerClient {

    public static void main(String[] args) {

        startService();
    }


    /**
     * 启动服务监听,等待客户端连接
     */
    private static void startService() {
        try {
            // 创建ServerSocket
            ServerSocket serverSocket = new ServerSocket(9999);
            System.out.println("--开启服务器,监听端口 9999--");

            // 监听端口,等待客户端连接
            while (true) {
                System.out.println("--等待客户端连接--");
                Socket socket = serverSocket.accept(); //等待客户端连接
                System.out.println("得到客户端连接:" + socket);

                startReader(socket);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 从参数的Socket里获取最新的消息
     */
    private static void startReader(final Socket socket) {

        new Thread() {
            @Override
            public void run() {
                DataInputStream reader;
                try {
                    // 获取读取流
                    reader = new DataInputStream(socket.getInputStream());
                    while (true) {
                        System.out.println("*等待客户端输入*");
                        // 读取数据
                        String msg = reader.readUTF();
                        System.out.println("获取到客户端的信息:" + msg)
               

                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
}

 


服务端向客户端发送信息

public class MyClass {

    public static void main(String[] args) {
        try {
            InetAddress addr = InetAddress.getLocalHost();
            System.out.println("local host:"+addr);


            ServerSocket serverSocket = new ServerSocket(50000);
            System.out.println("服务器已连接");
            while(true){
                System.out.println("123");
                Socket socket = serverSocket.accept();
                OutputStream outputStream = socket.getOutputStream();
                outputStream.write("你好,我是服务器\n".getBytes("utf-8"));
                outputStream.close();
                socket.close();
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

public class MainActivity extends AppCompatActivity {

    private Socket socket;
    TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }


    private void initView() {
        textView = (TextView) findViewById(R.id.tv);

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println(" xxx ");
                    socket = new Socket("192.168.1.100", 50000);
                    // socket.setSoTimeout(10000);//设置10秒超时
                    System.out.println("与服务器建立连接:" + socket);
                    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    String line = br.readLine();
                    System.out.println("与服务器建立连接:" + line);
                    Message msg = new Message();
                    msg.what = 1;
                    msg.obj = line;
                    handler.sendMessage(msg);
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();

    }


    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 1) {
                textView.setText("这是来自服务器的数据:" + msg.obj.toString());
            }
        }
    };


}

这里的地址要一致


 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 答1: 这是一段 Linux 下使用 C 语言实现 socket 编程的示例代码(客户端): ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT 8888 #define MAXDATASIZE 100 int main(int argc, char *argv[]) { int sockfd, num; char buf[MAXDATASIZE]; struct sockaddr_in server; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket() error."); exit(1); } server.sin_family = AF_INET; server.sin_port = htons(PORT); server.sin_addr.s_addr = inet_addr("127.0.0.1"); bzero(&(server.sin_zero), 8); if (connect(sockfd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1) { perror("connect() error."); exit(1); } if ((num = recv(sockfd, buf, MAXDATASIZE, 0)) == -1) { perror("recv() error."); exit(1); } buf[num - 1] = '\0'; printf("Server Message: %s\n", buf); close(sockfd); return 0; } ``` 这是一段 Linux 下使用 C 语言实现 socket 编程的示例代码(服务器端): ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #define PORT 8888 #define BACKLOG 1 int main() { int sockfd, new_fd; struct sockaddr_in server; struct sockaddr_in client; int sin_size; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket() error."); exit(1); } int opt = SO_REUSEADDR; setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); server.sin_family = AF_INET; server.sin_port = htons(PORT); server.sin_addr ### 答2: 下面是一个使用C语言编写的在Linux下使用Socket编程实现客户端服务端对话的示例代码: 服务端代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #define MAX_BUFFER_SIZE 1024 int main() { int server_socket, client_socket; struct sockaddr_in server_address, client_address; char buffer[MAX_BUFFER_SIZE]; int str_len; socklen_t client_address_size; server_socket = socket(AF_INET, SOCK_STREAM, 0); if (server_socket == -1) { perror("socket() error"); exit(1); } memset(&server_address, 0, sizeof(server_address)); server_address.sin_family = AF_INET; server_address.sin_port = htons(1234); server_address.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(server_socket, (struct sockaddr*)&server_address, sizeof(server_address)) == -1) { perror("bind() error"); exit(1); } if (listen(server_socket, 5) == -1) { perror("listen() error"); exit(1); } client_address_size = sizeof(client_address); client_socket = accept(server_socket, (struct sockaddr*)&client_address, &client_address_size); if (client_socket == -1) { perror("accept() error"); exit(1); } while (1) { str_len = read(client_socket, buffer, MAX_BUFFER_SIZE - 1); if (str_len == -1) { perror("read() error"); exit(1); } buffer[str_len] = '\0'; printf("Client: %s\n", buffer); printf("Server: "); fgets(buffer, MAX_BUFFER_SIZE, stdin); if (!strcmp(buffer, "q\n") || !strcmp(buffer, "Q\n")) { break; } write(client_socket, buffer, strlen(buffer)); } close(client_socket); close(server_socket); return 0; } ``` 客户端代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #define MAX_BUFFER_SIZE 1024 int main() { int client_socket; struct sockaddr_in server_address; char buffer[MAX_BUFFER_SIZE]; int str_len; client_socket = socket(AF_INET, SOCK_STREAM, 0); if (client_socket == -1) { perror("socket() error"); exit(1); } memset(&server_address, 0, sizeof(server_address)); server_address.sin_family = AF_INET; server_address.sin_port = htons(1234); server_address.sin_addr.s_addr = inet_addr("127.0.0.1"); if (connect(client_socket, (struct sockaddr*)&server_address, sizeof(server_address)) == -1) { perror("connect() error"); exit(1); } while (1) { printf("Client: "); fgets(buffer, MAX_BUFFER_SIZE, stdin); if (!strcmp(buffer, "q\n") || !strcmp(buffer, "Q\n")) { break; } write(client_socket, buffer, strlen(buffer)); str_len = read(client_socket, buffer, MAX_BUFFER_SIZE - 1); if (str_len == -1) { perror("read() error"); exit(1); } buffer[str_len] = '\0'; printf("Server: %s\n", buffer); } close(client_socket); return 0; } ``` 以上是一个简单客户端服务端对话的例子,运行服务端程序后,再运行客户端程序就可以实现在终端上进行对话客户端输入的内容会发送给服务端,在服务端的终端显示,并等待服务端复,服务端在接收到客户端消息后会复给客户端,并在客户端的终端显示。当输入"q"或"Q"时,客户端服务端会断开连接并退出程序。 ### 答3: 下面是一段使用C语言在Linux下实现客户端服务端对话的代码: 客户端代码: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #define BUF_SIZE 1024 int main() { int client_socket; struct sockaddr_in server_address; char buffer[BUF_SIZE]; // 创建套接字 client_socket = socket(AF_INET, SOCK_STREAM, 0); if (client_socket == -1) { perror("创建套接字失败"); exit(1); } // 设置服务器地址 memset(&server_address, 0, sizeof(server_address)); server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = inet_addr("127.0.0.1"); // 服务器IP地址 server_address.sin_port = htons(8888); // 服务器端口号 // 连接服务器 if (connect(client_socket, (struct sockaddr*)&server_address, sizeof(server_address)) == -1) { perror("连接服务器失败"); exit(1); } while (1) { // 输入要发送的消息 printf("请输入要发送的消息(输入exit退出):"); fgets(buffer, BUF_SIZE, stdin); // 发送消息服务器 if (send(client_socket, buffer, strlen(buffer), 0) == -1) { perror("发送消息服务器失败"); exit(1); } // 退出循环的条件 if (strcmp(buffer, "exit\n") == 0) { break; } // 接收服务器消息 memset(buffer, 0, BUF_SIZE); if (recv(client_socket, buffer, BUF_SIZE - 1, 0) == -1) { perror("接收服务器消息失败"); exit(1); } // 打印服务器消息 printf("服务器消息:%s", buffer); } // 关闭套接字 close(client_socket); return 0; } ``` 服务端代码: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #define BUF_SIZE 1024 int main() { int server_socket, client_socket; struct sockaddr_in server_address, client_address; socklen_t client_address_size; char buffer[BUF_SIZE]; // 创建套接字 server_socket = socket(AF_INET, SOCK_STREAM, 0); if (server_socket == -1) { perror("创建套接字失败"); exit(1); } // 设置服务器地址 memset(&server_address, 0, sizeof(server_address)); server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = htonl(INADDR_ANY); // 任意IP地址 server_address.sin_port = htons(8888); // 服务器监听端口号 // 绑定套接字 if (bind(server_socket, (struct sockaddr*)&server_address, sizeof(server_address)) == -1) { perror("绑定套接字失败"); exit(1); } // 监听套接字 if (listen(server_socket, 5) == -1) { perror("监听套接字失败"); exit(1); } printf("等待客户端连接...\n"); // 接受客户端连接 client_address_size = sizeof(client_address); client_socket = accept(server_socket, (struct sockaddr*)&client_address, &client_address_size); if (client_socket == -1) { perror("接受客户端连接失败"); exit(1); } printf("客户端连接成功\n"); while (1) { // 接收客户端发送的消息 memset(buffer, 0, BUF_SIZE); if (recv(client_socket, buffer, BUF_SIZE - 1, 0) == -1) { perror("接收客户端消息失败"); exit(1); } // 退出循环的条件 if (strcmp(buffer, "exit\n") == 0) { break; } // 打印客户端发送的消息 printf("客户端消息:%s", buffer); // 客户端消息 if (send(client_socket, buffer, strlen(buffer), 0) == -1) { perror("客户端消息失败"); exit(1); } } // 关闭套接字 close(client_socket); close(server_socket); return 0; } ``` 这段代码实现了一个简单客户端服务端对话的功能。客户端使用`socket`函数创建了一个套接字,然后通过`connect`函数连接到服务器上。连接成功后,进入一个循环,循环中首先通过`fgets`函数输入要发送的消息,然后通过`send`函数将消息发送给服务器。接着接收服务器消息,再打印出来。如果输入的消息是"exit",则退出循环,关闭套接字,程序结束。 服务端使用`socket`函数创建一个套接字,并设置服务器地址。然后通过`bind`函数将套接字与服务器地址绑定,并通过`listen`函数监听套接字。接着使用`accept`函数接受客户端连接,接收成功后进入一个循环。循环中首先接收客户端发送的消息,然后通过`send`函数将消息复给客户端。如果接收到的消息是"exit",则退出循环,关闭套接字,程序结束。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值