目的:
1.学习使用socket
2.再次复习使用流
3.能够灵活使用socket和流进行数据交换
4.了解URL地址的使用
创建用于通信的socket
指明和谁通信:ip地址 端口号
Socket socket = new Socket("10.129.0.138
",8989);
监听客户端连接
当有客户端来连接这个服务器 就可以得到对应的socket
当没有客户端来连接 服务器一直在这里等待
Socket socket = ss.accept();
实现对聊:
创建服务器端:
class Server{
//保存每一个来连接的socket对象
public static ArrayList<Socket> sockets = new ArrayList<>();
public static void main(String[] args) throws IOException, IOException {
ServerSocket serverSocket = new ServerSocket(9999);
//不停地等待客户端来连接
while (true){
Socket socket = serverSocket.accept();
//保存每一个客户端socket
sockets.add(socket);
//开启一个线程处理每一个客户端的输出
new ServerThread(socket).start();
}
}
}
创建一个子线程处理服务器端接收客户端的数据
class ServerThread extends Thread{
private Socket socket;
public ServerThread(Socket socket){
this.socket = socket;
}
@Override
public void run() {
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//读取数据
String line = null;
while ((line = br.readLine()) != null){
//群发消息
//遍历Socket维护的数组
for(Socket s : Server.sockets){
//向socket对应的客户端发送消息
PrintStream ps = new PrintStream(s.getOutputStream());
ps.println(line);
}
}
} catch (IOException e) {
System.out.println("网络异常 请重新登录");
System.exit(-1);
}finally {
//
//
try{
if(br != null){
br.close();
}
if(socket != null){
socket.close();
}
}catch (IOException e) {
e.printStackTrace();
}
}
}
}
创建客户端:
class Client{
public static void main(String[] args) throws IOException {
Socket socket = new Socket("10.129.0.138",6666);
//用一个子线程处理服务器端数据
new Thread(new ClientThread(socket)).start();
//主线程处理终端输入 发送给服务器端
BufferedReader keyin = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps = new PrintStream(socket.getOutputStream());
String line = null;
while ((line = keyin.readLine()) != null){
ps.println(line);
}
}
}
创建子线程处理客户端接收服务器端的数据
class ClientThread implements Runnable{
private Socket socket;
public ClientThread(Socket socket){
this.socket = socket;
}
@Override
public void run() {
BufferedReader br = null;
try {
//获取服务器端的输入流对象
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//读取数据
String line = null;
while ((line = br.readLine()) != null){
System.out.println(line);
}
}catch (IOException e){
e.printStackTrace();
}finally {
try{
if(br != null){
br.close();
}
if(socket != null){
socket.close();
}
}catch (IOException e) {
e.printStackTrace();
}
}
}
}
调用结果:
小结:
今天的socket的内容不多,但是用了多种方式来练习使用,还是感觉累的。虽然累,但是感觉还是很有意思的,毕竟可以传数据,像 在qq上发消息。继续加油!