简单的C/S聊天室
来源:互联网 发布:厦门seo平台 编辑:程序博客网 时间:2024/04/27 22:08
C/S聊天室分为服务器端和客户端,均需要采用多线程来实现。
服务器端主线程需要不断地监听端口,一旦有客户端的请求时,产生相应的Socket,将其加入到队列中并启动子线程,子线程负责接收客户端消息(使用Socket的getInputStream()函数来处理),再将消息发送到所有的客户端(使用Socket的getOutputStream()函数)。
客户端主线程负责获取键盘输入(相当于侦听键盘输入),并传递给Socket的输出流(使用Socket的getOutputStream(),为什么这里是getOutputStream(),因为对Socket而言是输出流),而子线程负责取得服务器端发过来的消息(使用Socket的getInputStream())。
代码如下,代码没有实现界面:
import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.util.ArrayList;public class Server {private final int PORT=30000;public static ArrayList<Socket> socketList=new ArrayList<Socket>();public void init(){try (ServerSocket serverSocket=new ServerSocket(PORT);){while(true){Socket socket=serverSocket.accept();socketList.add(socket);new Thread(new ServerThread(socket)).start();}}catch (IOException e) {// TODO Auto-generated catch blockSystem.out.println("服务器启动失败,是否"+PORT+"端口已被占用?");}}public static void main(String[] args) {// TODO Auto-generated method stubServer s=new Server();s.init();}}
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintStream;import java.net.Socket;public class ServerThread implements Runnable{private Socket s=null;private BufferedReader br=null;public ServerThread(Socket s){this.s=s;}@Overridepublic void run() {// TODO Auto-generated method stubtry {br=new BufferedReader(new InputStreamReader(s.getInputStream()));} catch (IOException e) {// TODO Auto-generated catch blockSystem.out.println("Socket对应的输入流获取失败!");}String content=null;while((content=readFromClient())!=null){for(Socket s:Server.socketList){try (PrintStream ps=new PrintStream(s.getOutputStream()); // 让该程序通过该输出流向socket中输出数据){ps.println(content);}catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}private String readFromClient() {// TODO Auto-generated method stubtry {return br.readLine();} catch (IOException e) {// TODO Auto-generated catch blockServer.socketList.remove(s);}return null;}}
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintStream;import java.net.Socket;import java.net.UnknownHostException;public class Client {private final static int PORT=30000;private final static String host="127.0.0.1";public static void main(String[] args) throws UnknownHostException, IOException {// TODO Auto-generated method stubSocket s=new Socket(host,PORT);new Thread(new ClientThread(s)).start(); // 子线程完成与服务器通信PrintStream ps=new PrintStream(s.getOutputStream()); // 让程序通过该输出流向Socket中输出数据,得到了socket的输出流String line=null;BufferedReader br=new BufferedReader(new InputStreamReader(System.in));// br.readline()不断读取键盘输入内容while((line=br.readLine())!=null){ps.println(line);}}}
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.Socket;public class ClientThread implements Runnable {private Socket s=null;private BufferedReader br=null;public ClientThread(Socket s) throws IOException{this.s=s;br=new BufferedReader(new InputStreamReader(s.getInputStream())); // 该句只是返回了这样一个对象,里面并不包含屏幕中的语句} // 其用readline()的时候才得到输入语句@Overridepublic void run() {// TODO Auto-generated method stubString content=null;try {while((content=br.readLine())!=null) // readline()遇到输入末尾的时候才会返回null{System.out.println(content);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
参考资料:疯狂JAVA讲义
0 0
- 简单的C/S聊天室
- Android的网络应用 - 简单的C/S聊天室
- java Scoket的c\\s结构聊天室
- 简易命令行界面的C/S聊天室
- 基于C/S架构的网络聊天室
- Android 网络:基于TCP协议通信,多线程,实现简单的C/S聊天室
- 简单socket 聊天室 C/S模式 小例子
- Linux C实现简单的网络聊天室
- 【聊天室】android 简单的聊天室
- Android实现C/S聊天室
- 聊天室(c/s架构)
- 基于TCP的C#开发的聊天室C/S程序
- 一些基于C/S技术的聊天室实例
- 命令行界面的C/S聊天室应用 (Socket多线程实现)
- 简单的java聊天室
- unity3D简单的聊天室
- unity3D简单的聊天室
- 简单的聊天室制作
- adb devices error or offline
- MVC 路由反向排除
- Z变换与傅里叶变换
- bzoj2753: [SCOI2012]滑雪与时间胶囊 MST
- IBM Cognos BI 最佳实践: 定制 IBM Cognos 8 UI
- 简单的C/S聊天室
- Ora-14074 When Trying To Add Partition
- IO流--FileWriter对已有的文件进行续写
- 基数排序
- 华为机试集锦(转载于互联网,谢谢各po)
- hdu1010 深搜剪枝.
- swift菜鸟入门视频教程-10-属性
- unix用户权限
- ECSHOP调用指定栏目文章