Chinaunix首页 | 论坛 | 博客
  • 博客访问: 33994
  • 博文数量: 14
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 142
  • 用 户 组: 普通用户
  • 注册时间: 2015-10-28 20:06
文章分类

全部博文(14)

文章存档

2016年(8)

2015年(7)

我的朋友

分类: Android平台

2016-07-01 20:11:30

 因为要用就拿来学习一下,但总也理解的不透彻,就总结一下,也算是学习的过程了。
一。基础知识
socket用于描述IP地址和端口,是一个通信链的句柄。它是网络通信过程中端点的抽象表示。Socket编程有TCP和UDP两种操作方式,TCP是基于连接的,采用数据流套接字Stream Socket;UDP是基于无连接的,采用数据包套接字DatagramSocket。Socket编程主要分服务器端编程和客户端编程。
二.基于TCP的Socket编程
服务器端编程步骤:    
1.创建服务器套接字ServerSocket,并绑定到一个端口上(可取0-65535,但0-1023是系统预留的)
2.
服务器套接字ServerSocket设置监听等待客户端连接请求
3.接收客户端连接请求,并返回一个Socket
客户端编程步骤:
1.创建客户端套接字Socket,需指定服务器端的IP地址和端口号
2.连接(Android创建socket时会自动连接),与服务器端通信
3.关闭套接字

注意:中间管道连接是通过InputStream/OutputStream流实现的,一旦管道建立,就可实现通信。
如下代码为在服务器端建立一个ServerSocket:

点击(此处)折叠或打开

  1. package com.exaple.ServerSocket;

  2. public class ServerSocket {

  3.     public static void main(String[] args) {
  4.         
  5.       ListenSocket listenSocket = new ListenSocket();
  6.       listenSocket.start();
  7.     }

  8. }

点击(此处)折叠或打开

  1. package com.exaple.ServerSocket;

  2. import java.io.IOException;
  3. import java.net.ServerSocket;
  4. import java.net.Socket;
  5. import javax.swing.JOptionPane;

  6. public class ListenSocket extends Thread {
  7.     @Override
  8.     public void run() {
  9.         try {
  10.             ServerSocket serverSocket = new ServerSocket(9999);
  11.             while (true) {
  12.                 Socket socket = serverSocket.accept();
  13.                 JOptionPane.showMessageDialog(null, "有客户端连接到了本机的9999端口");

  14.                 ChatSocket chatSocket = new ChatSocket(socket);
  15.                 chatSocket.start();
  16.                 SocketManager.GetSocketManager().add(chatSocket);
  17.             }
  18.         } catch (IOException e) {
  19.             // TODO Auto-generated catch block
  20.             e.printStackTrace();
  21.         }
  22.     }
  23. }

点击(此处)折叠或打开

  1. package com.exaple.ServerSocket;

  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStream;
  7. import java.net.Socket;

  8. public class ChatSocket extends Thread {

  9.     Socket socket;

  10.     public ChatSocket(Socket ss) {
  11.         socket = ss;
  12.     }

  13.     @Override
  14.     public void run() {
  15.         String str = "helloworld";
  16.         String line = null;

  17.         try {
  18.             // 向客户端发送信息
  19.             OutputStream outputStream = socket.getOutputStream();
  20.             outputStream.write(str.getBytes("gbk"));
  21.             outputStream.flush();
  22.             // 关闭输出流
  23.             socket.shutdownOutput();

  24.             // 接收客户端的的信息
  25.             InputStream inputStream = socket.getInputStream();
  26.             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

  27.             while ((line = bufferedReader.readLine()) != null) {
  28.                 System.out.print(line+"\n");
  29.             }
  30.             bufferedReader.close();
  31.             outputStream.close();
  32.             inputStream.close();
  33.             socket.close();
  34. //          System.out.println("isClosed:" + socket.isClosed());
  35.         } catch (IOException e) {
  36.             // TODO Auto-generated catch block
  37.             e.printStackTrace();
  38.         }
  39.     }
  40. }

点击(此处)折叠或打开

  1. package com.exaple.ServerSocket;

  2. import java.util.Vector;

  3. public class SocketManager {

  4.     private static final SocketManager sm = new SocketManager();

  5.     private SocketManager() {
  6.     }
  7.     public static SocketManager GetSocketManager() {
  8.         return sm;
  9.     }

  10.     Vector<ChatSocket> vector = new Vector<ChatSocket>();

  11.     public void add(ChatSocket cs) {
  12.         vector.add(cs);
  13.     }
  14. }
虽然看着有点多,但调理还是比较清晰的,考虑到accept()是阻塞函数,故在主线程中,新开一个线程用来监听,当有客户端连接时再开启另一个线程进行输入和输出的处理。另外SocketManager用来管理多个客户端的情况,在这用到了单例模式,即只有一个管理对象。可能有点麻烦的地方,是InputStream/OutputStream部分。这一部分是建立在java工程里面中,运行后利用终端的telnet 命令即可实现客户端与服务器的连接了。具体步骤:win+R -> cmd ->telnet localhost 9999。连接成功会弹出"有客户端连接到了本机的9999端口"窗口,在eclipse

如下为在客户端的代码:





阅读(798) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~