现在的位置: 首页 > 移动开发 > 正文

客户端(android)和服务器端(swing) Scoket通信实例

2019年06月06日 移动开发 ⁄ 共 3830字 ⁄ 字号 评论关闭

今天学习了Socket通信,特来此留贴一份以作纪念,废话不多说,直接进入主题:
         一个Socket通信的完成,需要客户端和服务器端的配合,这个配合就好比,两个人在电话中聊天,当甲拨出号码,乙在另一头接起电话时,他们直接就已经搭建了一个沟通的桥梁,对于客户端和服务器端是一样的。客户端通过Socket向指定ip地址的某端口发出数据通信请求,而服务器端此时也正在(违禁词语-已隐藏)该端口的情况,也就是说,对于指定的ip地址和端口号我们完全可以认为是甲乙电话通讯时的电话号码。
       Socket通信分为两种一个是UDP,一个是TCP,UDP的好处是:速度快,但是缺点是此协议只管发送数据,并不管对方是否接收到数据,而TCP每次发出数据后都要等待对方传回数据做以肯定,然后再发送下一部分数据。但是速度不如UDP快。
    下面是我做的实例中的部分代码:
     第一部分:我利用swing写了一个服务器端,用于(违禁词语-已隐藏)接收客户端发送来的数据,具体的界面和代码如下所示:
195234hlyhjo4xw3iob5wb.jpg

  1. public class SocketService extends JFrame {
  2. private JTextField nameTxt=null;
  3. String id="";
  4. public SocketService(){

  5. this.init();
  6. }
  7. public void init(){
  8. this.setTitle("Tcp服务器端");
  9. this.setBounds(100,100,400,250);
  10. this.createUI();
  11. //this.setVisible(true);
  12. this.setDefaultCloseOperation(EXIT_ON_CLOSE);
  13. }

  14. public void createUI(){
  15. JPanel panel=new JPanel();
  16. //添加边框
  17. Border border=BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
  18. TitledBorder tBorder=BorderFactory.createTitledBorder(border,"校验面板",TitledBorder.CENTER,TitledBorder.TOP);
  19. panel.setBorder(tBorder);
  20. panel.setLayout(null);
  21. this.add(panel);
  22. //网卡地址
  23. JLabel nameLbl=new JLabel("接收客户端数据:");
  24. nameLbl.setBounds(10,30,140,25);
  25. panel.add(nameLbl);
  26. nameTxt=new JTextField();
  27. nameTxt.setBounds(130,30,230,22);
  28. panel.add(nameTxt);


  29. //按钮
  30. JButton btn=new JButton("开启TCP服务");
  31. btn.setBounds(40,160,140,22);
  32. panel.add(btn);


  33. btn.addActionListener(new ActionListener(){
  34. public void actionPerformed(ActionEvent arg0){
  35. nameTxt.setText("");
  36. new TCPThread().start();
  37. }
  38. });


  39. JButton btn2=new JButton("开启UDP服务");
  40. btn2.setBounds(220, 160, 140, 22);
  41. panel.add(btn2);
  42. btn2.addActionListener(new ActionListener(){
  43. public void actionPerformed(ActionEvent arg0){
  44. nameTxt.setText("");
  45. new UDPThread().start();

  46. }
  47. });

  48. }
  49. //Tcp传输的操作过程
  50. class TCPThread extends Thread{

  51. public void run(){
  52. try {
  53. while(true){
  54. ServerSocket tcpSocket=null; 
  55. tcpSocket=new ServerSocket(4567);
  56. Socket s=null;
  57. s=tcpSocket.accept();//如果未收到数据,此句不会继续向下执行,一直处于(违禁词语-已隐藏)状态
  58. InputStream in=s.getInputStream();
  59. byte[] buffer=new byte[1024*4];
  60. int temp=0;
  61. while((temp=in.read(buffer))!=-1){
  62. nameTxt.setText(new String(buffer,0,temp));
  63. }
  64. s.close();
  65. tcpSocket.close();


  66. }
  67. } catch (IOException e) {
  68. // TODO Auto-generated catch block
  69. e.printStackTrace();
  70. }


  71. }

  72. }
  73. //UDP传输的操作过程
  74. class UDPThread extends Thread{

  75. public void run(){
  76. try {
  77. DatagramSocket d=new DatagramSocket(5678);
  78. byte[] data=new byte[1024];
  79. DatagramPacket packer=new DatagramPacket(data, data.length);
  80. try {
  81. d.receive(packer);//如果未收到数据,此句不会继续向下执行,一直处于(违禁词语-已隐藏)状态
  82. System.out.println(packer.getLength());
  83. } catch (IOException e) {
  84. // TODO Auto-generated catch block
  85. e.printStackTrace();
  86. }
  87. } catch (SocketException e) {
  88. // TODO Auto-generated catch block
  89. e.printStackTrace();
  90. }


  91. }


  92. }

复制代码

第二部分:客户端是利用android平台,具体的界面和他代码如下所示:
195345t1u9tetu6kwc66k1.jpg

  1. public class SocketClient extends Activity {
  2. /** Called when the activity is first created. */
  3. TextView tv = null;

  4. @Override
  5. public void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.main);
  8. Button tcpbtn = (Button) this.findViewById(R.string.Id1);
  9. Button udpbtn = (Button) this.findViewById(R.string.Id2);
  10. tv = (TextView) this.findViewById(R.string.text1);


  11. //tcp通信过程
  12. tcpbtn.setOnClickListener(new OnClickListener() {
  13. @Override
  14. public void onClick(View v) {
  15. try {
  16. Socket s = new Socket("192.168.0.115", 4567);//创建一个socket对象,绑定要通信的服务器端Ip和端口
  17. OutputStream out = s.getOutputStream();//将要传递的数据进行字节数组处理,然后以输出流的形式发送出去
  18. out.write(tv.getText().toString().getBytes());
  19. out.flush();
  20. } catch (UnknownHostException e) {
  21. // TODO Auto-generated catch block
  22. e.printStackTrace();
  23. } catch (IOException e) {
  24. // TODO Auto-generated catch block
  25. e.printStackTrace();
  26. }

  27. }

  28. });

  29. //udp通信过程
  30. udpbtn.setOnClickListener(new OnClickListener(){

  31. @Override
  32. public void onClick(View v) {
  33. // TODO Auto-generated method stub
  34. try {
  35. DatagramSocket ds=new DatagramSocket(5678);
  36. InetAddress serverAddr= InetAddress.getByName("192.168.0.115");//绑定要通信的服务器端IP
  37. byte[] data=tv.getText().toString().getBytes();
  38. DatagramPacket packet=new DatagramPacket(data,data.length,serverAddr,5678);
  39. ds.send(packet);
  40. } catch (Exception e) {
  41. // TODO Aut
  42. o-generated catch block
  43. e.printStackTrace();
  44. }
  45. }



  46. });
  47. }
  48. }

复制代码

经过测试在服务器端,如下图所示,可以接收到客户端发送过来的数据为:“hello”
1954281vxsoyxyoa5z1a1l.jpg

抱歉!评论已关闭.