android编程tcp通信,Android基于TCP协议的Socket通信简单实例

Socket通信有两种主要方式:TCP协议和UDP协议,两者区别是TCP协议要首先和接收方要建立连接然后发送数据,这样数据能保证送达,但速度较慢;UDP协议首先把数据打包,然后直接发送到接收方,无需建立连接诶,速度快,但容易丢失数据。这里是一个简单的基于TCP协议的通信实例:

直接上代码:

首先是java服务器的编写:

importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.OutputStreamWriter;importjava.io.PrintWriter;importjava.net.ServerSocket;importjava.net.Socket;public classnetserver {public static void main(String[] args) throwsIOException {

ServerSocket server=new ServerSocket(9090);//9090是端口号,由自己设置

System.out.println("服务器已启动");

Socket client=server.accept();//接收客户端请求//PrintStream out=new PrintStream(client.getOutputStream());

PrintWriter out=new PrintWriter(new OutputStreamWriter(client.getOutputStream(),"UTF-8"),true);

BufferedReader msg=new BufferedReader(new InputStreamReader(client.getInputStream(),"UTF-8"));//对缓冲区数据读取

StringBuffer info=new StringBuffer();//接收客户端发来的消息

info.append("I'm fine.你好! ");//回应的数据

info.append(msg.readLine());//接收的数据

System.out.println(info);//控制台输出将要发出的信息

out.print(info);//发送到客户端

out.close();

msg.close();

client.close();

server.close();

}

}

接下来是安卓客户端的代码:

packagecom.example.scoket;importandroidx.appcompat.app.AppCompatActivity;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.Message;importandroid.view.View;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.TextView;importjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.io.PrintStream;importjava.net.Socket;public class MainActivity extendsAppCompatActivity {private Button send=null;private TextView info=null;private Handler handler=null;private String s="";

@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

send=(Button)findViewById(R.id.send);

info=(TextView) findViewById(R.id.info);

send.setOnClickListener(newView.OnClickListener() {

@Overridepublic voidonClick(View v) {newThread()

{public voidrun(){try{

Socket client=newSocket("10.0.2.2",9090);//括号内为(服务器,端口号)

PrintStream out=newPrintStream(client.getOutputStream());

BufferedReader msgget=new BufferedReader(new InputStreamReader(client.getInputStream(),"UTF-8"));//读取返回的数据

out.println("已连接服务器");

s=msgget.readLine();

out.close();

msgget.close();

client.close();

}catch(Exception e)

{

e.printStackTrace();

}

handler.sendEmptyMessage(0);}}.start();

handler=newHandler() {//当有消息发来的时候就执行Handler方法

public voidhandleMessage(Message msg)

{super.handleMessage(msg);

info.setText(s);

}

};

}

});

}

}

服务器就填服务器的ip地址,如果服务器是在自己电脑上的,客户端在虚拟机上,那么服务器就填10.0.2.2,若是局域网连接的,就用在win+r >cmd>config查询一下电脑的ip;端口号必须与服务器一致,挑选的端口如果显示被占用就换一个,端口的取值就自行百度。

运行时先启动服务器,在运行客户端

运行效果:

客户端+服务器控制台

按钮点击前:

4f209e4ac0724ea43f0cc3ae6e944542.png

点击后:

5addd1b66b809bcf05666c8cb7fae0f4.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值