当前位置: 首页 > 科技观察

教你Socket通信(TCP-IP)

时间:2023-03-21 23:21:51 科技观察

网络上的两个程序通过双向通信连接实现数据交换,这种连接的一端称为套接字。建立网络通信连接至少需要一对端口号(套接字)。socket的本质是一个编程接口(API),它封装了TCP/IP。TCP/IP也为程序员进行网络开发提供了接口。这是Socket编程接口;具体形式;Socket是引擎,提供网络通信的能力。eclipse下载:https://www.eclipse.org/本文将给出完整的Socket通信代码,对eclipse中个人测试有效。在AndroidStudio中进行Java开发也是如此,只需将代码和控件匹配起来,注册监听即可。不同的是AS中的import语句不同,窗口不需要自己创建。效果如图:在eclipse中,File→New→JavaProject→给个英文名→Finish(我的名字是TCP)目录结构:创建完成后有一个src默认包,右键点击src→New→Package→进入com.net(因为我在程序中使用的包名是这个,可以同时改)→Finish然后右键com.net→New→Class→进入TCPClient(因为我程序中使用的类名)并右键单击com.net→新建→类→输入TCPServer(因为我程序中使用的类名)并将代码粘贴到两者中:TCPServerpackagecom.net;importjava.io.*;importjava.net.*;importjava.awt.*;importjava.awt.event.*;publicclassTCPServer{staticDataInputStreamdis=null;publicstaticvoidmain(String[]args){booleanstarted=false;Sockets=null;TextAreata=newTextArea();ta.append("从客户端收到的数据:"+"\n");ServerSocketss=null;try{ss=newServerSocket(8866);//端口号}catch(BindExceptione){System.exit(0);}catch(IOExceptione){e.printStackTrace();}Framef=newFrame("serverside");//表单名称f.setLocation(300,300);//表单出现位置f.setSize(200,200);//表单大小f.add(ta,BorderLayout.NORTH);f.pack();f.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});f.setVisible(true);try{//try-catch块捕获异常started=true;while(started){booleanbConnected=false;s=ss.accept();bConnected=true;dis=newDataInputStream(s.getInputStream());while(bConnected){Stringstr=dis.readUTF();ta.append(str+"\n");}}}catch(EOFExceptione){System.out.println("Clientclosed!");}catch(IOExceptione){e.printStackTrace();}最后{try{if(dis!=null)dis.close();if(s!=null)s.close();}catch(Exceptione){e.printStackTrace();}}}}TCPClientpackagecom.net;importjava.awt.*;importjava.awt.event.*;importjava.io.*;importjava.net.*;publicclassTCPClienttextendsFrame{Sockets=null;DataOutputStreamdos=null;DataInputStreamdis=null;TextFieldtf=newTextField(40);Listlist=newList(6);publicstaticvoidmain(String[]args){TCPClientclient=newTCPClient();client.list.add("向服务端发送的数据:");client.setTitle("客户端");client.run();}publicvoidrun(){setLocation(400,300);this.setSize(300,300);add(tf,BorderLayout.SOUTH);add(list,BorderLayout.NORTH);pack();this.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){disconnect();System.exit(0);}});tf.addActionListener(newMyListener());setVisible(true);connect();}publicvoidconnect(){try{s=newSocket("127.0.0.1",8866);dos=newDataOutputStream(s.getOutputStream());}catch(UnknownHostExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}publicvoiddisconnect(){try{dos.close();s.close();}catch(IOExceptione){e.printStackTrace();}}privateclassMyListenerimplementsActionListener{publicvoidactionPerformed(ActionEvente){Strings1=null;Strings2=null;Stringstr=tf.getText().trim();list.add(str);tf.setText("");try{dos.writeUTF(str);dos.flush();}catch(IOExceptione1){e1.printStackTrace();}}}}然后先跑server再跑client,否则会报错,因为本质socket通信是先打开服务器监听端口,然后才会出现渲染。本机loopbackIP为127.0.0.1,可以更改为其他IP地址,实现跨机Socket通信。本文转载自微信公众号《嵌入式Linux系统开发》,可通过以下二维码关注。转载本文请联系嵌入式Linux系统开发号。