转载自:http://www.eoeandroid.com/thread-92628-1-1.html 老猫今天学习了Socket通信,特来此留贴一份以作纪念,废话不多说,直接进入主题: 一个Socket通信的完成,需要客户端和服务器端的配合,这个配合就好比,两个人在电话中聊天,当甲拨出号码,乙在另一头接起电话时,他们直接就已经搭建了一个沟通的桥梁,对于客户端和服务器端是一样的。客户端通过Socket向指定ip地址的某端口发出数据通信请求,而服务器端此时也正在监听该端口的情况,也就是说,对于指定的ip地址和端口号我们完全可以认为是甲乙电话通讯时的电话号码。 Socket通信分为两种一个是UDP,一个是TCP,UDP的好处是:速度快,但是缺点是此协议只管发送数据,并不管对方是否接收到数据,而TCP每次发出数据后都要等待对方传回数据做以肯定,然后再发送下一部分数据。但是速度不如UDP快。 下面是我做的实例中的部分代码: 第一部分:我利用swing写了一个服务器端,用于监听接收客户端发送来的数据,具体的界面和代码如下所示: public class SocketService extends JFrame { private JTextField nameTxt=null; String id=""; public SocketService(){ this.init(); } public void init(){ this.setTitle("Tcp服务器端"); this.setBounds(100,100,400,250); this.createUI(); //this.setVisible(true); this.setDefaultCloseOperation(EXIT_ON_CLOSE); } public void createUI(){ JPanel panel=new JPanel(); //添加边框 Border border=BorderFactory.createEtchedBorder(EtchedBorder.LOWERED); TitledBorder tBorder=BorderFactory.createTitledBorder(border,"校验面板",TitledBorder.CENTER,TitledBorder.TOP); panel.setBorder(tBorder); panel.setLayout(null); this.add(panel); //网卡地址 JLabel nameLbl=new JLabel("接收客户端数据:"); nameLbl.setBounds(10,30,140,25); panel.add(nameLbl); nameTxt=new JTextField(); nameTxt.setBounds(130,30,230,22); panel.add(nameTxt); //按钮 JButton btn=new JButton("开启TCP服务"); btn.setBounds(40,160,140,22); panel.add(btn); btn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0){ nameTxt.setText(""); new TCPThread().start(); } }); JButton btn2=new JButton("开启UDP服务"); btn2.setBounds(220, 160, 140, 22); panel.add(btn2); btn2.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0){ nameTxt.setText(""); new UDPThread().start(); } }); } //Tcp传输的操作过程 class TCPThread extends Thread{ public void run(){ try { while(true){ ServerSocket tcpSocket=null; tcpSocket=new ServerSocket(4567); Socket s=null; s=tcpSocket.accept();//如果未收到数据,此句不会继续向下执行,一直处于监听状态 InputStream in=s.getInputStream(); byte[] buffer=new byte[1024*4]; int temp=0; while((temp=in.read(buffer))!=-1){ nameTxt.setText(new String(buffer,0,temp)); } s.close(); tcpSocket.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //UDP传输的操作过程 class UDPThread extends Thread{ public void run(){ try { DatagramSocket d=new DatagramSocket(5678); byte[] data=new byte[1024]; DatagramPacket packer=new DatagramPacket(data, data.length); try { d.receive(packer);//如果未收到数据,此句不会继续向下执行,一直处于监听状态 System.out.println(packer.getLength()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 复制代码 第二部分:客户端是利用android平台,具体的界面和他代码如下所示: public class SocketClient extends Activity { /** Called when the activity is first created. */ TextView tv = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button tcpbtn = (Button) this.findViewById(R.string.Id1); Button udpbtn = (Button) this.findViewById(R.string.Id2); tv = (TextView) this.findViewById(R.string.text1); //tcp通信过程 tcpbtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { Socket s = new Socket("192.168.0.115", 4567);//创建一个socket对象,绑定要通信的服务器端Ip和端口 OutputStream out = s.getOutputStream();//将要传递的数据进行字节数组处理,然后以输出流的形式发送出去 out.write(tv.getText().toString().getBytes()); out.flush(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); //udp通信过程 udpbtn.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub try { DatagramSocket ds=new DatagramSocket(5678); InetAddress serverAddr= InetAddress.getByName("192.168.0.115");//绑定要通信的服务器端IP byte[] data=tv.getText().toString().getBytes(); DatagramPacket packet=new DatagramPacket(data,data.length,serverAddr,5678); ds.send(packet); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } } 复制代码 经过测试在服务器端,如下图所示,可以接收到客户端发送过来的数据为:“hello” 现在附上实例源码,希望能对和我一样的初学者有帮助 SocketSample.rar (49.34 KB, 下载次数: 760) Activity, 搭建, 测试, Service, View 4.jpg (15.3 KB, 下载次数: 9)