import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
/**
* 服务器端
* @author Administrator
*
*/
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(9999);
System.out.println("----服务器已启动-----");
List<Socket> list = new ArrayList<Socket>();//声明一个存放socket对象的集合
while(true){
Socket socket = server.accept();//侦听socket连接
list.add(socket);//将侦听到的socket连接添加到集合中
ThreadSocket ts = new ThreadSocket(socket,list);//启动服务器处理每个socket的线程
ts.start();
}
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.List;
/**
* 服务器处理socket线程类
* @author Administrator
*
*/
public class ThreadSocket extends Thread {
private Socket socket;
private List<Socket> list;
public ThreadSocket(Socket socket, List<Socket> list) {
this.socket = socket;
this.list = list;
}
@Override
public void run() {
InputStream is = null;
OutputStream os = null;
try {
while(true){
is = socket.getInputStream();
byte[] b = new byte[1024];
int len = is.read(b);
String mess = new String(b,0,len);
//获取客户端IP地址和端口号等信息,并在服务器端打印
System.out.println(socket.getInetAddress().getHostAddress()+":"+socket.getPort()+"\n"+mess);
//遍历存放socket的集合,向所有客户端输出信息
for (Socket so : list) {
os = so.getOutputStream();
os.write(mess.getBytes());
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
/**
* 客户端
* @author Administrator
*
*/
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
//开启客户端之前输入名字
Scanner sc = new Scanner(System.in);
System.out.println("请输入网名:");
String name = sc.next();
Socket socket = new Socket("localhost",9999);
System.out.println("-----"+name+"已上线-----");
//将socket的输入输出流传到对应的线程类
ThreadReader tr = new ThreadReader(socket.getInputStream());
ThreadWriter tw = new ThreadWriter(socket.getOutputStream());
//把上面的网名设置为当前线程的名字
tr.setName(name);
tw.setName(name);
tr.start();
tw.start();
}
}
import java.io.IOException;
import java.io.InputStream;
/**
* 处理客户端输入流的线程类
* @author Administrator
*
*/
public class ThreadReader extends Thread {
private InputStream is;
public ThreadReader(InputStream is) {
this.is= is;
}
@Override
public void run() {
try {
while(true){
byte[] b = new byte[1024];
int len = is.read(b);
String mess = new String(b,0,len);
System.out.println(mess);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
/**
* 处理客户端输出流的线程类
* @author Administrator
*
*/
public class ThreadWriter extends Thread {
private OutputStream os;
public ThreadWriter(OutputStream os) {
this.os = os;
}
@Override
public void run() {
Scanner sc = new Scanner(System.in);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
try {
while(true){
System.out.println("请输入信息:");
String mess = sc.next();
//把当期线程的名称,日期和内容发送到服务器
String info = sdf.format(new Date())+" "+Thread.currentThread().getName()+"说:"+mess;
os.write(info.getBytes());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}