使用Socket通信(二)

这个socket有梗,主要是服务器端有梗,可能大家会碰到同样的问题,网上查了好久,这里分享一下解决办法.首先在第一个module建一个类SimpleServer,这个类就是服务端,建好之后在代码左边有一个运行按钮,直接点击运行即可,不用运行module.这样服务端运行到accept就会阻塞,直到有客户端跟他连接才会继续往下运行,服务端端口号用Tomcat的端口号.梗就在这里:运行之后报错:BindException: Address already in use: JVM_Bind网上查了好久原来是端口被占用发生了冲突,然后我把Tomcat关掉又好了,很纠结关掉Tomcat怎么使用客户端啊,网上这样解决:打开Tomcat,cmd然后输入netstat -ano找到占用Tomcat端口的PID

我的是6728然后windows窗口底部任务栏右键打开任务管理器

点击详细信息再点击PID按顺序查找,找到6728,然后右键终止程序,这时再运行服务端就不会报BindException: Address already in use: JVM_Bind错误了

public class SimpleServer {

    public static void main(String[] args) throws IOException {

        //创建一个ServerSocket,用于监听客户端socket的连接请求
        ServerSocket ss=new ServerSocket(9999);
        //采用循环不断接受来自客户端的请求,服务器端也对应产生一个Socket
        while(true){
            Socket s=ss.accept();
            OutputStream os=s.getOutputStream();
            os.write("您好,您收到了服务器的新年祝福!
".getBytes("utf-8"));
            System.out.println("服务器");
            os.close();
            s.close();
        }

    }
}

点击左上角绿色三角运行服务端

///////////////

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new Thread(){
            @Override
            public void run() {
                super.run();
                try {
                    Socket socket = new Socket("你的ip地址,cmd输入ipconfig查找", 9999);
                    //设置10秒之后即认为是超时
                    socket.setSoTimeout(10000);
                    BufferedReader br = new BufferedReader(new InputStreamReader(
                            socket.getInputStream()));
                    String line = br.readLine();
                    System.out.println("来自服务器的数据:" + line);

                    br.close();
                    socket.close();

                } catch (UnknownHostException e) {
                    // TODO Auto-generated catch block
                    Log.e("UnknownHost", "来自服务器的数据");
                    e.printStackTrace();
                } catch (IOException e) {
                    Log.e("IOException", "来自服务器的数据");
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        }.start();


    }
}

上面是另一个module的主activity,也就是客户端,输出信息代表接收到服务端发送的消息.不要忘了打开网络权限

原文地址:https://www.cnblogs.com/Ocean123123/p/10960227.html