转载自: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”
|
|