使用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("您好,您收到了服务器的新年祝福!\n".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,也就是客户端,输出信息代表接收到服务端发送的消息.不要忘了打开网络权限