博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Socket DEMO
阅读量:3561 次
发布时间:2019-05-20

本文共 3677 字,大约阅读时间需要 12 分钟。

Socket 的传输数据的两种方式:
     1、TCP  可靠协议,假设服务器发送消息给客户端,客户端收到之后,会有一个回应给服务器端,告诉它“我已经收到了”,如果服务器在设定的时间没没有收到客户端的反馈,则认为消息发送不成功,继续发送 ,所以TCP协议是安全的,可靠协议,很少出现丢包的情况
     2、UDP 不可靠协议,服务器端只管发送数据给客户端,无论你有没有收到,都不会做处理, 一般用来做直播。视频通过这些用的比较多
     
首先看服务器的代码:
[java]
  1. public class ServerSockt {  
  2.        //因为可能不止一个客户端,所以采用集合的方式来管理socket  
  3.        public static List<Socket> lists = Collections.synchronizedList( new ArrayList<Socket>());  
  4.        public static void main(String[] args) {  
  5.              try {  
  6.                   ServerSocket ss = new ServerSocket(8285);  
  7.                    whiletrue){  
  8.                         Socket s =ss.accept();  
  9.                          lists.add(s);  
  10.                          //开启一个线程 接受与发送消息给客户端  
  11.                          new Thread( new ServerThread(s)).start();  
  12.                   }  
  13.                     
  14.             } catch (Exception e) {  
  15.                     
  16.             }  
  17.       }  
  18. }  
  19.   
  20. import java.io.BufferedReader;  
  21. import java.io.InputStreamReader;  
  22. import java.io.PrintStream;  
  23. import java.net.Socket;  
  24. import java.text.SimpleDateFormat;  
  25. import java.util.Date;  
  26.   
  27. public class ServerThread extends Thread {  
  28.        private Socket socket;  
  29.        private BufferedReader br;  
  30.   
  31.        public ServerThread(Socket socket) throws Exception {  
  32.              super();  
  33.              this. socket = socket;  
  34.              //编码一定要统一  
  35.              br = new BufferedReader( new InputStreamReader(socket.getInputStream(),"UTF-8" ));  
  36.       }  
  37.        @Override  
  38.        public void run() {  
  39.              super.run();  
  40.              try {  
  41.                   String msg;  
  42.                    while((msg= br.readLine())!= null){  
  43.                         SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" );//格式化日期  
  44.                          //将接收到的字符串读取出来,加上日期返回给客户端,编码一定要统一  
  45.                         PrintStream ps = new PrintStream(socket .getOutputStream(), true,"UTF-8" );  
  46.                               ps.println( "服务器说还给你:" +msg+">>>>>" +df.format( new Date()));  
  47.                               System. out.println(msg);  
  48.                               ps.flush();  
  49.                   }  
  50.             } catch (Exception e) {  
  51.                     
  52.             }  
  53.       }  
  54. }  
注意一个细节!就是编码问题,一定要统一流的编码格式
Android客户端的代码
[java]
  1. public class MainActivity extends AppCompatActivity {  
  2.     private EditText text; //文本框,要发送给服务器的数据  
  3.     private Button btnSocket;  //发送消息的按钮  
  4.     private ListView listView; //消息列表的ListView  
  5.     private MsgAdapter adapter; //消息适配器  
  6.     private List<String> list = new ArrayList<>();//ListView的数据源  
  7.     private Socket socket = null;  
  8.   
  9.     @Override  
  10.     protected void onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.         setContentView(R.layout.activity_main);  
  13.         text = (EditText) findViewById(R.id.text);  
  14.         btnSocket = (Button) findViewById(R.id.button);  
  15.         listView = (ListView) findViewById(R.id.msgList);  
  16.         adapter = new MsgAdapter(MainActivity.this, list);  
  17.         listView.setAdapter(adapter);  
  18.         //开始的时候,我直接放在主线程,直接出现不能在主线程的工作的错误,于是开启了一个线程  
  19.         new Thread(new Runnable() {  
  20.             @Override  
  21.             public void run() {  
  22.                 socket();  
  23.   
  24.             }  
  25.         }).start();  
  26.         //发送消息的按钮,发送消息到服务器是异步的,所以也只能另开一个线程  
  27.         btnSocket.setOnClickListener(new View.OnClickListener() {  
  28.             @Override  
  29.             public void onClick(View v) {  
  30.                 new Thread(new Runnable() {  
  31.                     @Override  
  32.                     public void run() {  
  33.                         sendMsg();  
  34.                     }  
  35.                 }).start();  
  36.             }  
  37.         });  
  38.   
  39.     }  
  40.   
  41.     /** 
  42.      * 初始化Socket 
  43.      */  
  44.     private void socket() {  
  45.         try {  
  46.             if (socket == null) {  
  47.                 socket = new Socket("192.168.11.150"8285);  
  48.             }  
  49.             receiveMsg();  
  50.         } catch (IOException e) {  
  51.             e.printStackTrace();  
  52.         }  
  53.     }  
  54.   
  55.     /** 
  56.      * 发送消息的方法 
  57.      */  
  58.     public void sendMsg() {  
  59.         PrintStream writer = null;  
  60.         try {  
  61.             String msg = "客户端说:" + text.getText().toString();  
  62.             //此处一定要设置编码的格式,一定要和服务器统一,否则会出现乱码的情况  
  63.             writer = new PrintStream(socket.getOutputStream(), true"UTF-8");  
  64.             writer.println(msg);  
  65.             writer.flush();  
  66.             list.add(msg);  
  67.             handler.sendEmptyMessage(0);  
  68.         } catch (IOException e) {  
  69.             e.printStackTrace();  
  70.         }  
  71.   
  72.     }  
  73.   
  74.     /** 
  75.      * 接收到来自服务器的消息 
  76.      */  
  77.     public void receiveMsg() {  
  78.         BufferedReader br = null;  
  79.         try {  
  80.             //此处一定要设置编码的格式,一定要和服务器统一,否则会出现乱码的情况  
  81.             br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));  
  82.             String msg;  
  83.             while ((msg = br.readLine()) != null) {  
  84.                 list.add(msg);  
  85.                 handler.sendEmptyMessage(0);  
  86.             }  
  87.   
  88.         } catch (IOException e) {  
  89.             e.printStackTrace();  
  90.         } finally {  
  91.             if (br != null) {  
  92.                 try {  
  93.                     br.close();  
  94.                 } catch (IOException e) {  
  95.                     e.printStackTrace();  
  96.                 }  
  97.             }  
  98.         }  
  99.   
  100.     }  
  101.   
  102.     private Handler handler = new Handler() {  
  103.         @Override  
  104.         public void handleMessage(Message msg) {  
  105.             super.handleMessage(msg);  
  106.             adapter.notifyDataSetChanged();  
  107.         }  
  108.     };  
  109.   
  110. }  

转载地址:http://ybcrj.baihongyu.com/

你可能感兴趣的文章
安装rabbitmq时踩的坑
查看>>
2021-06-09数据库添加多条数据
查看>>
简单的JAVA小作品
查看>>
CMake下载
查看>>
未调用fflush产生的图片文件无法打开问题
查看>>
SQL 约束(二)
查看>>
SQL ALTER用法(三)
查看>>
SQL where子句及查询条件语句(六)
查看>>
SQL 连接JOIN(九)
查看>>
linux VM虚拟机可以ping通主机,但主机无法ping通虚拟机
查看>>
linux 错误码
查看>>
C++ 中Struct与typedef struct总结
查看>>
WNetAddConnection2调用失败,错误码1200/1312
查看>>
POI读写Excel的基本使用
查看>>
淘宝网站的架构演进
查看>>
设置zookeeper开机自启动流程
查看>>
CentOS安装mysql5.7的教详细流程
查看>>
项目整合微信扫码登录功能
查看>>
分布式文件系统FastDfs的搭建
查看>>
Springboot项目利用Java客户端调用FastDFS
查看>>