Socket实例

package tf.thread;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ChatServer {
private static final int PORT = 8888; // 端口号
private static List<Socket> list = new ArrayList<Socket>(); // 保存连接对象
private ExecutorService exec;
private ServerSocket server;

public static void main(String[] args) {
new ChatServer();
}

public ChatServer() {
try {
server = new ServerSocket(PORT);
exec = Executors.newCachedThreadPool();
System.out.println("服务器已启动!");

Socket client = null;
while (true) {
client = server.accept(); // 接收客户连接
list.add(client);
exec.execute(new ChatTask(client));
}
} catch (IOException e) {
e.printStackTrace();
}
}

static class ChatTask implements Runnable {
private Socket socket;
private BufferedReader br;
private PrintWriter pw;
private String msg;

public ChatTask(Socket socket) throws IOException {
this.socket = socket;
br = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
msg = "【" + this.socket.getInetAddress() + "】进入聊天室!当前聊天室有【"
+ list.size() + "】人";

sendMessage();
}

public void run() {
try {
while ((msg = br.readLine()) != null) {
if (msg.trim().equals("bye")) {
list.remove(socket);
br.close();
pw.close();
msg = "【" + socket.getInetAddress() + "】离开聊天室!当前聊天室有【"
+ list.size() + "】人";
socket.close();

sendMessage();
break;
} else {
msg = "【" + socket.getInetAddress() + "】说:" + msg;
sendMessage();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 群发消息给聊天室的所有人
*/
private void sendMessage() throws IOException {
System.out.println(msg);
for (Socket client : list) {
pw = new PrintWriter(client.getOutputStream(), true);
pw.println(msg);
}
}
}
}

package tf.thread;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ChatServer {
private static final int PORT = 8888; // 端口号
private static List<Socket> list = new ArrayList<Socket>(); // 保存连接对象
private ExecutorService exec;
private ServerSocket server;

public static void main(String[] args) {
new ChatServer();
}

public ChatServer() {
try {
server = new ServerSocket(PORT);
exec = Executors.newCachedThreadPool();
System.out.println("服务器已启动!");

Socket client = null;
while (true) {
client = server.accept(); // 接收客户连接
list.add(client);
exec.execute(new ChatTask(client));
}
} catch (IOException e) {
e.printStackTrace();
}
}

static class ChatTask implements Runnable {
private Socket socket;
private BufferedReader br;
private PrintWriter pw;
private String msg;

public ChatTask(Socket socket) throws IOException {
this.socket = socket;
br = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
msg = "【" + this.socket.getInetAddress() + "】进入聊天室!当前聊天室有【"
+ list.size() + "】人";

sendMessage();
}

public void run() {
try {
while ((msg = br.readLine()) != null) {
if (msg.trim().equals("bye")) {
list.remove(socket);
br.close();
pw.close();
msg = "【" + socket.getInetAddress() + "】离开聊天室!当前聊天室有【"
+ list.size() + "】人";
socket.close();

sendMessage();
break;
} else {
msg = "【" + socket.getInetAddress() + "】说:" + msg;
sendMessage();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 群发消息给聊天室的所有人
*/
private void sendMessage() throws IOException {
System.out.println(msg);
for (Socket client : list) {
pw = new PrintWriter(client.getOutputStream(), true);
pw.println(msg);
}
}
}
}


聊天室客户端(输入bye可退出聊天室)
Java代码
package tf.thread;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ChatClient {
private static final int PORT = 8888;
private static ExecutorService exec = Executors.newCachedThreadPool();

public static void main(String[] args) throws Exception {
new ChatClient();
}

public ChatClient() {
try {
Socket socket = new Socket("192.168.1.120", PORT);
exec.execute(new Sender(socket));
System.out
.println("【" + socket.getInetAddress() + "】您好,欢迎来到阿飞聊天室!");

BufferedReader br = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
String msg;
while ((msg = br.readLine()) != null) {
System.out.println(msg);
}
} catch (Exception e) {

}
}

/**
* 客户端线程获取控制台输入消息
*/
static class Sender implements Runnable {
private Socket socket;

public Sender(Socket socket) {
this.socket = socket;
}

public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
String msg;

while (true) {
msg = br.readLine();
pw.println(msg);

if (msg.trim().equals("bye")) {
pw.close();
br.close();
exec.shutdownNow();
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值