这是一个初学JavaSE的初学者 运用Java基础技术socket做的一个聊天室
服务器端;
package zxlt2;
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8090);
while (true) {
Socket socket = server.accept();// 监听状态
System.out.println("服务器启动,准备接收数据");
new ServerThread(socket).start();
}
}
}
服务器端启动线程
package zxlt2;
import java.io.*;
import java.net.Socket;
import java.util.*;
public class ServerThread extends Thread {
private Socket socket;
public static Map<Socket, String> map = new HashMap<Socket, String>();// 设置一个静态变量保存socket到List集合中
public ServerThread(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
try {
while (true) {
InputStream is = socket.getInputStream();// 打开输入流
byte[] b = new byte[1024];// 创建数组
if (!map.containsKey(socket)) {
is.read(b);
String name = new String(b);
map.put(socket, name);
} else {
is.read(b);
Set<Socket> set = map.keySet();
for (Socket socket1 : set) {
String str = map.get(socket1);
if (!str.equals(map.get(socket))) {
OutputStream os = socket1.getOutputStream();
os.write(b);
} else {
String s = "----ok----";
OutputStream os1 = socket1.getOutputStream();
os1.write(s.getBytes());
}
}
}
}
} catch (
IOException e) {
System.err.println("客户端有人下线");
}
}
}
客户端
package zxlt2;
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("192.168.4.169", 8090); // 创建客户端sockte
Scanner sc = new Scanner(System.in);
System.out.println("请输入名字:");
String name = sc.nextLine();
new ClientThread(socket, name).start();
new ClientThread2(socket, name).start();
// is.close();// 结束输入流
// os.close();// 结束输出流
}
}
客户端输出流线程
package zxlt2;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;
public class ClientThread extends Thread {
private Socket socket;
private String name;
public ClientThread(Socket socket, String name) {
super();
this.socket = socket;
this.name = name;
}
@Override
public void run() {
Scanner s = new Scanner(System.in);// 控制台输入并扫描控制台
try {
OutputStream os = socket.getOutputStream();//打开输出流传输数据
os.write((name+"上线了").getBytes());//发送上线信息给服务器告知所有人此客户端已经上线已经上线;
while (true) {
String ss = s.nextLine();
if (ss.contains("bye")) {//判断是否输入“bye”字符出现则跳出线程关闭客户端
System.exit(0);
}
Date date=new Date();
SimpleDateFormat simple=new SimpleDateFormat("yyyy-MM-dd_hh-mm-ss-SS_");
os.write(("-----"+name +":-----"+"\n"+simple.format(date)+"\n"+ ss).getBytes());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端输入流线程
package zxlt2;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
public class ClientThread2 extends Thread {
private Socket socket;
private String name;
public ClientThread2(Socket socket, String name) {
super();
this.socket = socket;
this.name = name;
}
@Override
public void run() {
try {
while (true) {
InputStream is = socket.getInputStream();
byte[] b = new byte[1024];
is.read(b);
String ss1 = new String(b);
System.out.println(ss1.trim());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}