概括:
本程序可以实现多个人之间的聊天,只要连接上服务器就可以通信。
程序放在"net"包下
1.客户端(Client.java)
package net;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
String name = null;
try {
System.out.print("请输入昵称:");
Scanner in1 = new Scanner(System.in);
name = in1.nextLine();
System.out.println(name + "连接服务器...");
Socket socket = new Socket("127.0.0.1",8080);
System.out.println(name + "成功连接上服务器");
System.out.println("————————————————————————————————————————————————");
//将名字发送给服务器
BufferedOutputStream bos1 =
new BufferedOutputStream(
socket.getOutputStream());
bos1.write(name.getBytes());
bos1.flush();
//System.out.println("名字发送成功");
//开启新线程来接收消息
new ClientReciveMsgThread(socket).start();
//发送消息给服务器 如果发送的为"exit"则退出客户端
BufferedOutputStream bos =
new BufferedOutputStream(socket.getOutputStream());
Scanner in = new Scanner(System.in);
while(true){
String str = in.nextLine();
str = str.trim();
if(str.equals("exit")){
break;
}
byte[] b = str.getBytes();
bos.write(b, 0, b.length);
bos.flush();
}
socket.close();
bos.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.客户端接收服务器发送的消息的进程(ClientReciveMsgThread.java)
package net;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.Socket;
public class ClientReciveMsgThread extends Thread{
private Socket socket;
public ClientReciveMsgThread(Socket socket){
this.socket = socket;
}
public void run(){
try {
BufferedInputStream bis =
new BufferedInputStream(socket.getInputStream());
byte[] b = new byte[1024];
while(true){
int len = bis.read(b);
if(len == -1){
break;
}
String str = new String (b,0,len);
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.服务器端(Server.java)
package net;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
public class Server {
public static int num = 1;
public static void main(String[] args) {
ArrayList online = new ArrayList();
try {
ServerSocket server = new ServerSocket(8080);
System.out.println("启动服务器...");
System.out.println("————————————————————————————————————————————————");
while(true){
Socket socket = server.accept();
//接收客户端发来的名字
byte[] b = new byte[1024];
int len = new BufferedInputStream(socket.getInputStream()).read(b);
String name = new String(b,0,len);
online.add(socket);
System.out.println(name +"连接服务器成功!");
num++;
//开启新线程来接收消息
new ServerReciveMsgThread(online,socket,name).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
4.服务器端接收客户端发来的消息的进程(ServerReciveMsgThread.java)
package net;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Scanner;
public class ServerReciveMsgThread extends Thread{
private ArrayList online;
private Socket socket;
private String name;
public ServerReciveMsgThread(ArrayList online,Socket socket,String name){
this.socket = socket;
this.name = name;
this.online = online;
}
public void run(){
try {
BufferedInputStream bis =
new BufferedInputStream(socket.getInputStream());
File file = new File("c:/1/MSG.txt");
FileOutputStream fos = new FileOutputStream(file,true);
byte[] b = new byte[1024];
while(true){
int len = bis.read(b);
if(len == -1){
break;
}
String str = new String (b,0,len);
str = str.trim();
//加上用户名
str = name + ":" + str;
//将从客户端发来的消息发送到每个客户端
for (Socket s : online) {
if(s != socket){
BufferedOutputStream bos =
new BufferedOutputStream(s.getOutputStream());
byte[] by = str.getBytes();
bos.write(by, 0, by.length);
bos.flush();
}
}
//将消息内容保存到"c:1/MSG.txt"文件中
//加入回车在文件中隔行显示
str = str + "\r\n";
writeMsgToFile(fos, str);
System.out.print(str);
}
bis.close();
fos.close();
} catch (IOException e) {
//客户端关闭时会发生异常
System.out.println(name + "下线了");
}
}
//服务器接收到的消息发送给文件
public void writeMsgToFile(FileOutputStream fos,String msg){
byte[] b = msg.getBytes();
try {
fos.write(b);
fos.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}