Socket服务端实现
来源:互联网 发布:东华软件个股分析 编辑:程序博客网 时间:2024/06/17 18:10
监听类
import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;/** * 监听类 * Created by user on 2016/11/8. */public class SocketListener extends Thread { ServerSocket serverSocket; Socket socket; @Override public void run() { super.run(); try { serverSocket = new ServerSocket(12345); //死循环,保证服务端不断地监听 while (true) { /** * 该方法为阻塞方法 * 等待监听是否有客户端链接 * 一旦有客户端连接到服务端,代码才会继续执行 */ socket = serverSocket.accept(); System.out.println("有客户端连接成功"); ChatSocket chatSocket = new ChatSocket(socket);// 把创建出来的聊天类对象放入到manager的集合中 SocketManager.getInstance().add(chatSocket); chatSocket.start(); } } catch (IOException e) { e.printStackTrace(); } }}
用命令行验证是否连接成功,telnet localhost是建立本地连接,“12345”是端口号
聊天类
import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.Socket;/** * 聊天类 * 1.调用write的方法的时候,忘服务器发送数据 * 2.只要聊天类已创建,服务端就要一直从客户端获取数据,看是否有数据发动过来 * Created by user on 2016/11/8. */public class ChatSocket extends Thread { Socket socket; public ChatSocket(Socket socket) { this.socket = socket; } @Override public void run() { super.run(); try { BufferedReader reader = new BufferedReader( new InputStreamReader(socket.getInputStream(), "UTF-8")); String line = null; while ((line = reader.readLine()) != null) { SocketManager.getInstance().publish(this,line); } } catch (IOException e) { e.printStackTrace(); } } public void write(String str) { try { /** * 1.从socket中获取到输出的字节流 * 2.要把字节流转换成字符流(BufferedWriter) * 3.字节流转换成字符流需要用到一个writer的类进行转换 */ BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(socket.getOutputStream(), "UTF-8")); //注意:在写出的时候要给写出的内容加一个\n,然后调用flush进行发送 writer.write(str + "\n"); writer.flush(); } catch (IOException e) { e.printStackTrace(); } }}
管理类
import java.util.Vector;/** * 管理类 * 1.管理聊天类对象 * 2.转发数据 * Created by user on 2016/11/8. */public class SocketManager { /** * vector和list 都是数据集合 * vector 是线程安全的 * list 是线程不安全 */ Vector<ChatSocket> chatSockets = new Vector<>(); /** * managet需要使用单例 * 需要使用懒汉式 * 以为懒汉式是线程安全的方式 */ private static final SocketManager manager = new SocketManager(); private SocketManager() { } public static SocketManager getInstance() { return manager; } //往manager的集合中存入一个聊天天对象 public void add(ChatSocket chatSocket) { chatSockets.add(chatSocket); } /** * 转发功能 * chatSocket 发送数据的聊天类对象 * str 发出的数据 */ public void publish(ChatSocket chatSocket, String str) { for (int i = 0; i < chatSockets.size(); i++) { ChatSocket cs = chatSockets.get(i); if (!chatSocket.equals(cs)) { cs.write(str); } } }}
下面是客户端代码
package com.baozilichao.mysocketclient;import android.app.Activity;import android.os.AsyncTask;import android.os.Bundle;import android.view.View;import android.view.Window;import android.widget.EditText;import android.widget.TextView;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.Socket;public class MainActivity extends Activity { EditText et; TextView tv; BufferedWriter writer; BufferedReader reader; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); et = (EditText) findViewById(R.id.et); tv = (TextView) findViewById(R.id.tv); findViewById(R.id.connect).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { connect(); } }); findViewById(R.id.send).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { send(); } }); } public void connect() { new AsyncTask<String, String, String>() { @Override protected String doInBackground(String... strings) { try { Socket socket = new Socket("***.**.**.***", 12345); writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8")); reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8")); publishProgress("链接成功"); String line = null; while ((line = reader.readLine()) != null) { publishProgress(line); } } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onProgressUpdate(String... values) { tv.append("对方说的内容:" + values[0] + "\n"); } }.execute(); } public void send() { try { writer.write(et.getText().toString() + "\n"); writer.flush(); tv.append("我说的内容"+et.getText().toString()+"\n"); } catch (IOException e) { e.printStackTrace(); } }}
1 0
- Socket服务端实现
- php socket 服务端实现代码
- socket实现服务端客户端通讯
- socket实现客户端与服务端通信(一)服务端
- socket实现客户端与服务端通信(三)服务端升级
- J2ME:使用socket实现聊天室服务端
- 多进程服务端实现-共享socket
- socket实现服务端与客户端的通讯
- Socket编程简单实现服务端客户端连接
- socket编程---之单连接服务端实现
- Socket实现服务端与客户端通信
- SOCKET服务端
- 服务端socket
- socket服务端
- socket实现tcp/ip服务端源码,无线程
- 一步一步实现用c#编写异步socket服务端监听程序
- python socket上传文件的服务端和客户端实现
- C++ socket编程 实现服务端与客户端的通讯
- Android Studio实用快捷键和修改,持续更新
- 关于request.getSession(true/false/null)的区别
- 90. Subsets II
- 嵌入式Linux ARM汇编(四)——ARM汇编程序设计
- Maven创建webapp项目过程中问题以及解决方案
- Socket服务端实现
- Android一些你需要知道的布局优化技巧
- oracle游标
- 值栈
- 嵌入式Linux ARM汇编(五)——ARM体系结构过程调用标准
- HTML5 增强的页面元素
- java中使用fastjson、jackson、json-lib解析JSON-------------------妈妈再也不用担心JSON解析
- 数据结构之数组go言语实现
- SQL 子查询 EXISTS 和 NOT EXISTS