手把手教你 Socket 通信(TCP/IP)

开发 后端 通信技术
本文将给出完整 Socket 通信代码,在 eclipse 中亲测有效。在Android Studio中用Java开发也是一样的,只是把代码和控件搭配一下,注册监听就好。

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

建立网络通信连接至少要一对端口号(socket)。socket 本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

下载eclipse:

https://www.eclipse.org/

本文将给出完整 Socket 通信代码,在 eclipse 中亲测有效。在Android Studio中用Java开发也是一样的,只是把代码和控件搭配一下,注册监听就好。区别就是在 AS 中 import 的声明不太一样,然后窗口不需要自己建立。

效果如图:

在eclipse中,File→New→Java Project→起个英文名字→Finish(我起的名字是TCP)

目录结构:

新建完以后有个src默认包,右键 src→New→Package→ 输入 com.net(因为程序里我用的包的名字是这个,你可以同时两个一起改)→ Finish

然后右键 com.net → New → Class → 输入 TCPClient(因为我程序里面用的这个类名称)

然后右键 com.net → New → Class → 输入 TCPServer(因为我程序里面用的这个类名称)

两个里面分别粘贴代码:

TCPServer

  1. package com.net; 
  2.  
  3. import java.io.*; 
  4. import java.net.*; 
  5. import java.awt.*; 
  6. import java.awt.event.*; 
  7.  
  8. public class TCPServer { 
  9.  static DataInputStream dis=null
  10.  public static void main(String[] args){ 
  11.   boolean started=false
  12.   Socket s=null
  13.   TextArea ta=new TextArea(); 
  14.   ta.append("从客户端接受的数据:"+"\n"); 
  15.   ServerSocket ss=null
  16.   try{ 
  17.    ss=new ServerSocket(8866);                       //端口号 
  18.   }catch(BindException e){ 
  19.    System.exit(0); 
  20.   }catch(IOException e){ 
  21.    e.printStackTrace(); 
  22.   } 
  23.   Frame f=new Frame("服务器端");              //窗体名称  
  24.   f.setLocation(300, 300);           //窗体出现位置 
  25.   f.setSize(200, 200);            //窗体大小 
  26.   f.add(ta,BorderLayout.NORTH); 
  27.   f.pack(); 
  28.   f.addWindowListener(new WindowAdapter(){ 
  29.    public void windowClosing(WindowEvent e){ 
  30.     System.exit(0); 
  31.    } 
  32.   }); 
  33.   f.setVisible(true); 
  34.   try{               //try-catch块捕捉异常 
  35.    started=true
  36.    while(started){ 
  37.     boolean bConnected=false
  38.     s=ss.accept(); 
  39.     bConnected=true
  40.     dis=new DataInputStream(s.getInputStream()); 
  41.     while(bConnected){ 
  42.         String str=dis.readUTF(); 
  43.         ta.append(str+"\n"); 
  44.     } 
  45.    } 
  46.   }catch(EOFException e){                                  
  47.    System.out.println("Client closed!"); 
  48.   }catch(IOException e){ 
  49.    e.printStackTrace(); 
  50.   }finally{ 
  51.    try{ 
  52.     if(dis!=null
  53.      dis.close(); 
  54.     if(s!=null
  55.      s.close(); 
  56.    }catch(Exception e){ 
  57.     e.printStackTrace(); 
  58.    } 
  59.   } 
  60.  } 

TCPClient

  1. package com.net; 
  2. import java.awt.*; 
  3. import java.awt.event.*; 
  4. import java.io.*; 
  5. import java.net.*; 
  6.  
  7. public class TCPClient extends Frame{ 
  8.  Socket s=null
  9.  DataOutputStream dos=null
  10.  DataInputStream  dis=null
  11.  TextField tf=new TextField(40); 
  12.  List list=new List(6); 
  13.  public static void main(String[] args){ 
  14.   TCPClient client=new TCPClient(); 
  15.   client.list.add("向服务器端发送的数据:"); 
  16.   client.setTitle("客户端"); 
  17.   client.run(); 
  18.  } 
  19.  public void run(){ 
  20.   setLocation(400,300); 
  21.   this.setSize(300, 300); 
  22.   add(tf,BorderLayout.SOUTH); 
  23.   add(list,BorderLayout.NORTH); 
  24.   pack(); 
  25.   this.addWindowListener(new WindowAdapter(){ 
  26.    public void windowClosing(WindowEvent e){ 
  27.     disconnect(); 
  28.     System.exit(0); 
  29.    } 
  30.   }); 
  31.   tf.addActionListener(new MyListener()); 
  32.   setVisible(true); 
  33.   connect(); 
  34.  } 
  35. public void connect(){ 
  36.  try{ 
  37.   s=new Socket("127.0.0.1",8866); 
  38.   dos=new DataOutputStream(s.getOutputStream()); 
  39.  }catch(UnknownHostException e){ 
  40.   e.printStackTrace(); 
  41.  }catch(IOException e){ 
  42.   e.printStackTrace(); 
  43.  } 
  44. public void disconnect(){ 
  45.  try{ 
  46.   dos.close(); 
  47.   s.close(); 
  48.  }catch(IOException e){ 
  49.   e.printStackTrace(); 
  50.  } 
  51. private class MyListener implements ActionListener{ 
  52.     public void actionPerformed(ActionEvent e){ 
  53.       String s1=null
  54.       String s2=null
  55.       String str=tf.getText().trim(); 
  56.       list.add(str); 
  57.       tf.setText(""); 
  58.       try{ 
  59.        dos.writeUTF(str); 
  60.        dos.flush(); 
  61.       }catch(IOException e1){ 
  62.          e1.printStackTrace();   
  63.       } 
  64.       } 
  65.     } 

然后先运行服务器,再运行客户端,否则会报错,因为Socket通信本质是先打开服务器监听端口。然后就会出现效果图。

本机回环 IP 是 127.0.0.1,你可以改为其他 IP 地址,即可实现跨机 Socket 通信。

本文转载自微信公众号「嵌入式Linux系统开发」,可以通过以下二维码关注。转载本文请联系嵌入式Linux系统开发众号。

 

 

责任编辑:姜华 来源: 嵌入式Linux系统开发
相关推荐

2011-01-10 14:41:26

2011-05-03 15:59:00

黑盒打印机

2021-07-14 09:00:00

JavaFX开发应用

2020-03-08 22:06:16

Python数据IP

2021-07-03 09:04:22

XPathPython免费代理IP

2011-02-22 13:46:27

微软SQL.NET

2021-02-26 11:54:38

MyBatis 插件接口

2021-12-28 08:38:26

Linux 中断唤醒系统Linux 系统

2022-12-07 08:42:35

2022-07-27 08:16:22

搜索引擎Lucene

2023-04-26 12:46:43

DockerSpringKubernetes

2022-01-08 20:04:20

拦截系统调用

2022-03-14 14:47:21

HarmonyOS操作系统鸿蒙

2020-07-09 08:59:52

if else模板Service

2009-11-09 14:57:37

WCF上传文件

2016-04-27 09:49:16

用户模型产品总结

2011-01-06 10:39:25

.NET程序打包

2009-04-22 09:17:19

LINQSQL基础

2024-10-16 11:40:47

2021-09-30 18:27:38

数据仓库ETL
点赞
收藏

51CTO技术栈公众号