android手机端和电脑端的TCP通信(用Socket类)

准备:
1:添加权限
2:手机电脑应连同一个wife(要联网的)

代码:

public class MainActivity extends AppCompatActivity {
    private Button bt_send;
    private static  final  String TAG="MainActivity------->";
    private Socket socket;
    private InputStream inputStream;
    private  OutputStream outputStream;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bt_send=(Button)findViewById(R.id.send);
        bt_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try{
                            socket=new Socket("192.168.123.129",8080);

                            if(socket==null){
                                socket.isConnected();
                                Log.d(TAG, "开始链接");

                            }
                            OutputStream mOut=socket.getOutputStream();
                            mOut.write("我来了".getBytes());
                            mOut.flush();
                            socket.close();
                        }catch (IOException e){
                            e.printStackTrace();
                            Log.d(TAG, "连接失败");
                        }
                    }
                }).start();
	});
	}
	}

一些心得------:
socket一旦断开,就无法再重新连接了(相关资源已被释放掉了)。只能重新创建新的socket去连接。
如果创建 Socket socket=new Socket();
如下面的代码将输出false。
Socket socket = new Socket();
System.out.println(socket.isClosed());

先创建Socke对象再连接的例子:

Socket socket=new Socket();
URI uri = new java.net.URI("localhost:8080"); 
String host = uri.getHost(); int port = uri.getPort(); 
InetSocketAddress isa = new java.net.InetSocketAddress(host, port); 
socket.connect(isa); 
``

Socket类的方法]([https://www.cnblogs.com/furuihua/p/11295644.html]

一个服务端连接多个服务器,这时接受信息 的输入流需要开启线程,上代码:

public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
int port=8779;
  ServerSocket server=new ServerSocket(port);
  System.out.println("server将一直等待链接的到来");
while(true){

final Socket socket=server.accept();
    System.out.println("有客户端连接");
new Thread(new Runnable() {

@Override
public void run() {
// TODO 自动生成的方法存根
try{                     
                      InputStream inputStream=socket.getInputStream();
byte[] receive = new byte[1024];
int len=0;                     
while((len=inputStream.read(receive)) != -1) 
{  
                       StringBuilder sb=new StringBuilder();
                       sb.append(new String(receive,0,len));
              		System.out.println("来自:"+socket.getPort()+"消息为:"+sb.toString());
            		  Writer writer=new OutputStreamWriter(socket.getOutputStream());
            		  writer.write(String.format("hi,%d!today is sunny",socket.getPort()));
            		  writer.flush();
            		  System.out.println("["+socket.getPort()+"]回复客户端的消息发送成功!");            
}

              System.out.println(+socket.getPort()+"已断开");             
}catch(Exception e){
      e.printStackTrace();
}       
}
}).start();
}
}

android手机端和电脑端的TCP通信(用Socket类)_第1张图片

在这里插入图片描述

*

遇到 客户端向服务器发送消息发现 software caused connection abort: recv failed问题:
产生这个异常的原因有多种方面,单就如 Software caused 所示,
是由于程序编写的问题,而不是网络的问题引起的.
已知会导致这种异常的一个场景如下:
客户端和服务端建立tcp的短连接,每次客户端发送一次请求,
服务端响应后关闭与客户端的连接.
如果客户端在服务端关闭连接后,没有释放连接,继续试图发送请求和接收响应.
这个时候就会出错 .
错误截图:

android手机端和电脑端的TCP通信(用Socket类)_第2张图片

这是出错代码:

public class client
 {  
 public static void main(String[] args) {    
  try {                      
   Socket socket=new Socket("127.0.0.1",8779);              //输出流         
        OutputStream outputStream=socket.getOutputStream();           
           PrintWriter printWriter=new PrintWriter(outputStream);      
                   printWriter.write("我是客户端1
                   printWriter.flush();            
                     socket.close();                              
                        } catch (IOException e) {                
                         e.printStackTrace();       
                           }    
                         while(true){}         
         }
  }

修改后:
android手机端和电脑端的TCP通信(用Socket类)_第3张图片
区别在于我在socket.close();上加了一句,InoutStream inputStream=socket.getInoutStream();

产生这个异常的原因有多种方面,单就如 Software caused 所示,
是由于程序编写的问题,而不是网络的问题引起的.
已知会导致这种异常的一个场景如下:
客户端和服务端建立tcp的短连接,每次客户端发送一次请求,
服务端响应后关闭与客户端的连接.
如果客户端在服务端关闭连接后,没有释放连接,继续试图发送请求和接收响应.
这个时候就会出错.

所以如果我不加 InoutStream inputStream=socket.getInoutStream();这句,客户端就会直接执行socket.close();,那服务器向客户端发送消息就会出现异常。

另一个疑问:
服务器用下面的代码的接受消息时,会把开头第一个字符丢失,也不知道为啥????百度了好久都找不到问题所在…

 BufferedInputStream bufferedInputStream = new BufferedInputStream(socket.getInputStream());
                      byte[] receive = new byte[1024];
                      int read = bufferedInputStream.read(receive);
                      System.out.println("客服端收到消息:"+new String(receive));
                      

用下面的代码就一切正常

 InputStream inputStream=socket.getInputStream();
                      byte[] receive = new byte[1024];
                      int len=0;
                      
                      while((len=inputStream.read(receive)) != -1) 
                 {  
                       StringBuilder sb=new StringBuilder();
                       sb.append(new String(receive,0,len));
              System.out.println("来自:"+socket.getPort()+"消息为:"+sb.toString());
              }

你可能感兴趣的:(android,socket,java)