Socket小练习
来源:互联网 发布:怎么免费做网络推广 编辑:程序博客网 时间:2024/06/11 03:32
本例实现了多客户端,当客户端a发送消息,按下回车后,所有的客户端均会收到a的消息。例子十分简单,做socket入门之用:
Myserver.java
package server;import server.ServerThread;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.util.ArrayList;public class Myserver { //建立一个socket集合 public static ArrayList<Socket> socketList = new ArrayList<Socket>(); public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(30000); //循环用于不断接收客户端连接 while(true){ Socket s = serverSocket.accept(); socketList.add(s); //对于每一个客户端都启动一个新的线程 new Thread(new ServerThread(s)).start(); } }}
ServerThread.java
package server;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{ Socket socket = null; //该线程所处理的Socket 所对应的输入流 BufferedReader br =null; public ServerThread(Socket s) throws IOException{ this.socket= s; br = new BufferedReader(new InputStreamReader(socket.getInputStream())); } public void run(){ try { String content =null; while((content = readFromClient())!=null){ for(Socket s:Myserver.socketList){ PrintStream ps = new PrintStream(s.getOutputStream()); ps.println(content); } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private String readFromClient() { // TODO Auto-generated method stub try { return br.readLine(); } catch (IOException e) { // TODO Auto-generated catch block Myserver.socketList.remove(socket); } return null; }}
刚刚开始接触socket对socket的getInputStream( )和getOutputStream( )方法不够理解,查资料后,解析如下:
socket的输入流和输出流
socket提供了InputStream getInputStream( );
OutputStream getOutputStream( ) l两个方法来获取输入流和输出流。
在理解这两个方法之前,首先要理解InputStream 和OutputStream
将流想象成管道,输入流是从别人创建的管道(如客户端创建的管道)里读数据
输出流则是向管道(自己的管道)中放数据
那么socket.getInputStream( )方法意为获取输入流,
SocketThread.java 部分代码解析
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
先将客户端发送的数据以字节流的形式从管道中读出,然后用它初始化一个字符流,再用这个字符流初始化一个字符缓冲流;
PrintStream ps = new PrintStream(s.getOutputStream());
意为获取将socket的输出流作为PrintStream的输出流
ps.println(content);
content 定义为从客户端读取的数据,用PrintStream 打印输出。
Myclient.java
package client;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintStream;import java.net.Socket;import java.net.UnknownHostException;public class MyClient { public static void main(String[] args) throws UnknownHostException, IOException { Socket socket = new Socket("127.0.0.1", 30000); //启动client 线程,不断读取来自服务器的消息 new Thread(new ClientThread(socket)).start(); //获取socket 对象对应的输出流 PrintStream printStream = new PrintStream(socket.getOutputStream()); String line = null; //不断从键盘读取输入 BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in)); while((line = bReader.readLine())!=null) printStream.println(line); }}
ClientThread.java
package client;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.Socket;public class ClientThread implements Runnable { private Socket socket; private BufferedReader bf; public ClientThread(Socket socket) throws IOException { this.socket = socket; // ??inputStreamReader this.bf = new BufferedReader(new InputStreamReader(socket.getInputStream())); } @Override public void run() { // TODO Auto-generated method stub try { String content = null; while((content = bf.readLine())!=null) System.out.println(content); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
以上代码均测试通过
下一篇将会详细剖析 InputStream 、 InputStreamReader和BufferedReader
- Socket小练习
- SOCKET小练习--简易时间服务器
- 小练习
- 小练习
- 小练习
- 小练习
- 小练习
- 小练习
- 小练习
- 小练习
- 小练习
- 小练习
- 小练习
- 小练习
- 小练习
- 小练习
- 小练习
- 小练习
- LeetCode 513 Find Bottom Left Tree Value(二叉树层序遍历)
- [BZOJ1514]添加括号
- [LeetCode] 122. Best Time to Buy and Sell Stock II
- spring读取配置文件的两种方式
- Android应用如何匹配不同的手机分辨率
- Socket小练习
- 管闲事的小明
- 禅
- Glide使用详解(一)
- 才第一天
- 本机eclipse连接本机centos虚拟机安装好的redis
- 558D
- RabbitMQ学习(1) RabbitMQ介绍
- 使用sessionStorage实现页面间传值与传对象