InetAddress类
public class InetAddressTest {
public static void main(String[] args) throws UnknownHostException {
//获取本机的InetAddressTest实例
InetAddress localHost = InetAddress.getLocalHost();
System.out.println("计算机名:"+localHost.getHostName());
System.out.println("ip地址:"+localHost.getHostAddress());
System.out.println();
System.out.println(localHost);
}
}
运行结果:
计算机名:LAPTOP-FVORT239
ip地址:192.168.216.1
LAPTOP-FVORT239/192.168.216.1
多线程服务器
服务器端
public class SimpleSocketServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(6666);
System.out.println("服务器启动");
while (true)
{
Socket socket = serverSocket.accept();//监听,等待客户端连接上来
InetAddress inetAddress= socket.getInetAddress();//得到客户端的地址信息
System.out.println("客户端:"+ inetAddress.getHostAddress() + "连接上来了");
ServerThread serverThread = new ServerThread(socket);
new Thread(serverThread).start();
}
}
}
服务器端线程
public class ServerThread implements Runnable {
private Socket socket;
public ServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
while (true)
{
InputStream is = null;
try {
is = socket.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
OutputStream os = null;
try {
os = socket.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
DataInputStream dataInputStream = new DataInputStream(is);
DataOutputStream dataOutputStream = new DataOutputStream(os);
String string = null;
try {
string = dataInputStream.readUTF();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(string);
try {
dataOutputStream.writeUTF(string);
if(string.equals("byebye"))
{
System.out.println("客户端下线了,我也退出了");
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端
public class TcpClient {
// public static boolean isDead = false;
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",6666);
ClientThread clientThread = new ClientThread(socket);
Thread child = new Thread(clientThread);
child.start();
OutputStream os = socket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(os);
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要发给服务器的信息:byebye 退出");
while (scanner.hasNext())//阻塞在此处,等待用户在控制台的输入
{
String string = scanner.nextLine();
dataOutputStream.writeUTF(string);
if(string.equals("byebye"))
{
break;
}
System.out.println("请输入要发给服务器的信息:byebye 退出");
}
}
}
客户端线程
public class ClientThread implements Runnable{
private Socket socket;
public ClientThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
while (true)
{
try {
InputStream inputStream = socket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
String response = dataInputStream.readUTF();//阻塞
System.out.println("服务器回应:" + response);
if(response.equals("byebye"))
{
System.out.println("退出");
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
运行结果
SimpleSocketServer
------------------------------------------
服务器已启动!
用户/192.168.216.1已上线!
zhangsan
lisi
用户/192.168.216.1已上线!
王五
张飞
byebye
客户下线了,服务器也下线!
byebye
客户下线了,服务器也下线!
TcpClient 1
------------------------------------------
请输入服务器IP地址:
192.168.216.1
请输入用户想要发的信息,输入byebye退出!
zhangsan
请输入用户想要发的信息,输入byebye退出!
服务器回应:zhangsan
lisi
请输入用户想要发的信息,输入byebye退出!
服务器回应:lisi
byebye
用户选择退出程序!
服务器回应:byebye
服务器关闭客户端线程!
TcpClient 2
------------------------------------------
请输入服务器IP地址:
192.168.216.1
请输入用户想要发的信息,输入byebye退出!
王五
请输入用户想要发的信息,输入byebye退出!
服务器回应:王五
张飞
请输入用户想要发的信息,输入byebye退出!
服务器回应:张飞
byebye
用户选择退出程序!
服务器回应:byebye
服务器关闭客户端线程!
基于socket公共聊天室的实现
1.客户端
public class TcpClient {
static String username = "";
public static void helpList() {
System.out.println("提示:进入聊天室,默认公聊!!");
System.out.println("/L 用户在线列表,用户#信息 私聊,/C 查看聊天记录,/Q 退出系统");
}
public static void main(String[] args) throws IOException {
//用IP地址建立与服务器对应的socket
Scanner scanner1 = new Scanner(System.in);
System.out.println("请输入服务器IP地址:");
String ServerIP = scanner1.nextLine();
Socket socket = new Socket(ServerIP,8899);
//用户输入
System.out.println("请输入用户名:");
username = scanner1.nextLine();
System.out.println(username + "上线了");
System.out.println("欢迎进入聊天室,需要帮助请输入/A");
//开启客户端进程
ClientThread clientThread = new ClientThread(socket);
Thread child = new Thread(clientThread);
child.start();
//输出用户名以便服务器接收
OutputStream os = socket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(os);
dataOutputStream.writeUTF(username);
dataOutputStream.flush();
//判断命令
while (scanner1.hasNext())
{
String message = scanner1.next();
if (message.equalsIgnoreCase("/A"))
{
helpList();
}
else if (message.equalsIgnoreCase("/C"))
{
//根据路径在控制台上输出文件信息
File file = new File(username + ".txt");
BufferedReader br = new BufferedReader(new FileReader(file));
String str = null;
while (br.readLine() != null)
{
str = br.readLine();
System.out.println(str);
}
br.close();
}
else
{
dataOutputStream.writeUTF(message);
if (message.equalsIgnoreCase("/Q"))
{
//向服务器输出该退出用户的用户名
dataOutputStream.writeUTF(username);
System.out.println(username + "已退出聊天室!");
System.exit(0);
}
}
}
}
}
ClientThread.java
public class ClientThread implements Runnable {
Socket socket;
public ClientThread(Socket socket) {
this.socket = socket;
}
public void writeFile(String strMsg){
try {
//向文件中写入服务器发来的信息
File file = new File(TcpClient.username + ".txt");
FileWriter fw = new FileWriter(file,true);
BufferedWriter bw = new BufferedWriter(fw);
bw.write(strMsg);
bw.newLine();
bw.close();
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true)
{
//输入流
InputStream is = null;
try {
is = socket.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
//包装输入流
DataInputStream dataInputStream = new DataInputStream(is);
try {
//接收输入文字
String response = dataInputStream.readUTF();
writeFile(response);
System.out.println(response);
} catch (SocketException s){
//关闭用户端socket
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
//退出当前进程
System.out.println("服务器断开~~~~~~~~~");
System.exit(0);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}
2.服务端
public class SimpleSocketServer {
//建立MAP用于存放用户信息,static后面可以直接调用
public static Map<String,Socket> name2client = new HashMap<>();
public static void main(String[] args) throws IOException {
//启动服务器
ServerSocket serverSocket = new ServerSocket(8899);
System.out.println("服务器已启动!");
//循环接收
while (true)
{
//接收socket
Socket socket = serverSocket.accept();
//通过socket拿到用户IP地址
InetAddress inetAddress = socket.getInetAddress();
System.out.println("客户端"+ inetAddress + "已上线!");
//接收用户发送来的用户名
InputStream is = socket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(is);
String client_name = dataInputStream.readUTF();
//将用户名和接收到的socket加入MAP
name2client.put(client_name,socket);
//启动服务器线程
ServerThread serverThread = new ServerThread(client_name,socket);
Thread server = new Thread(serverThread);
server.start();
}
}
}
ServerThread.java
public class ServerThread implements Runnable{
String client_name;
Socket socket;
public ServerThread(String client_name, Socket socket) {
this.client_name = client_name;
this.socket = socket;
}
@Override
public void run() {
send_msg_to_all_users(client_name + "进入了聊天室!");
//循环启动
while (true)
{
String message = null;
try {
//接收用户发来的信息
InputStream is = socket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(is);
message = dataInputStream.readUTF();
String[] cmd = message.split("#");
//判断信息属性值
if (cmd.length == 2)
{
if (SimpleSocketServer.name2client.containsKey(cmd[0]))
{
send_msg_personally(cmd[0],cmd[1]);
}
else
{
OutputStream os = socket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(os);
dataOutputStream.writeUTF("用户不存在!");
}
}
else if (message.equalsIgnoreCase("/L"))
{
getList();
}
else if (message.equalsIgnoreCase("/Q"))
{
send_msg_to_all_users(client_name + "退出了聊天室!");
System.out.println(client_name + "刚刚退出了聊天室!");
//退出聊天室的时候从MAP中清除该用户
SimpleSocketServer.name2client.remove(client_name);
//服务器线程用return退出就可以
return;
}
else
{
send_msg_to_all_users(client_name + "说:" + message);
}
} catch (SocketException s){
try {
//关闭当前socket
System.out.println("用户掉线,关闭当前服务器上连接" + client_name +"的socket!");
SimpleSocketServer.name2client.remove(client_name);
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
//退出线程
System.out.println("退出当前服务于" + client_name + "的服务器线程!");
return;
}
catch (IOException e) {
e.printStackTrace();
}
}
}
//公聊
public void send_msg_to_all_users(String msg){
for (Map.Entry<String,Socket> entry : SimpleSocketServer.name2client.entrySet())
{
try {
OutputStream os = entry.getValue().getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(os);
dataOutputStream.writeUTF(getDate() + " " + msg);
dataOutputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//私聊
public void send_msg_personally(String specific_user,String msg){
Socket socket1 = SimpleSocketServer.name2client.get(specific_user);
try {
OutputStream os = socket1.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(os);
dataOutputStream.writeUTF(getDate() + " " + client_name + "对你说:" + msg);
dataOutputStream.flush();
OutputStream os1 = socket.getOutputStream();
DataOutputStream dataOutputStream1 = new DataOutputStream(os1);
dataOutputStream1.writeUTF(getDate() + " " + "你对" + specific_user + "说:" + msg);
dataOutputStream1.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
//获得在线用户列表
public void getList(){
OutputStream os = null;
try {
os = socket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(os);
dataOutputStream.writeUTF("在线用户列表:");
dataOutputStream.writeUTF("在线人数为:" + SimpleSocketServer.name2client.size());
for (Map.Entry<String,Socket> entry : SimpleSocketServer.name2client.entrySet())
{
dataOutputStream.writeUTF("用户名称为:" + entry.getKey());
dataOutputStream.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 时间
public String getDate() {
// 获得data对象
Date nowTime = new Date();
// 创建格式化参数
String pattern = "HH:mm:ss";
// 创建SimpleDateFormat对象
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
// 定义一个变量接收时间
String timePattern = sdf.format(nowTime);
// 返回当前时间
return timePattern;
}
}
运行结果
SimpleSocketServer
---------------------------------------
服务器已启动!
客户端/127.0.0.1已上线!
客户端/10.25.44.142已上线!
客户端/192.168.234.1已上线!
客户端/192.168.190.1已上线!
奇异博士刚刚退出了聊天室!
用户掉线,关闭当前服务器上连接美国队长的socket!
退出当前服务于美国队长的服务器线程!
Process finished with exit code 1
TcpClient 1
---------------------------------------
请输入服务器IP地址:
127.0.0.1
请输入用户名:
钢铁侠
钢铁侠上线了
欢迎进入聊天室,需要帮助请输入/A
13:41:06 钢铁侠进入了聊天室!
13:41:34 雷神进入了聊天室!
13:42:14 奇异博士进入了聊天室!
13:42:49 美国队长进入了聊天室!
大家好
13:43:06 钢铁侠说:大家好
13:43:37 美国队长说:我们是复仇者联盟
13:45:20 奇异博士说:我要下线了
13:45:50 奇异博士退出了聊天室!
服务器要断
13:46:36 钢铁侠说:服务器要断
服务器断开~~~~~~~~~
Process finished with exit code 0
TcpClient 2
---------------------------------------
请输入服务器IP地址:
10.25.44.142
请输入用户名:
雷神
雷神上线了
欢迎进入聊天室,需要帮助请输入/A
13:41:34 雷神进入了聊天室!
13:42:14 奇异博士进入了聊天室!
13:42:49 美国队长进入了聊天室!
13:43:06 钢铁侠说:大家好
13:43:37 美国队长说:我们是复仇者联盟
美国队长#小声点儿
13:43:58 你对美国队长说:小声点儿
13:45:20 奇异博士说:我要下线了
13:45:50 奇异博士退出了聊天室!
/l
在线用户列表:
在线人数为:2
用户名称为:钢铁侠
用户名称为:雷神
13:46:36 钢铁侠说:服务器要断
服务器断开~~~~~~~~~
Process finished with exit code 0
TcpClient 3
---------------------------------------
请输入服务器IP地址:
192.168.234.1
请输入用户名:
奇异博士
奇异博士上线了
欢迎进入聊天室,需要帮助请输入/A
13:42:14 奇异博士进入了聊天室!
13:42:49 美国队长进入了聊天室!
13:43:06 钢铁侠说:大家好
13:43:37 美国队长说:我们是复仇者联盟
我要下线了
13:45:20 奇异博士说:我要下线了
/c
13:42:14 奇异博士进入了聊天室!
13:42:49 美国队长进入了聊天室!
13:43:06 钢铁侠说:大家好
13:43:37 美国队长说:我们是复仇者联盟
13:45:20 奇异博士说:我要下线了
/q
奇异博士已退出聊天室!
Process finished with exit code 0
TcpClient 4
---------------------------------------
请输入服务器IP地址:
192.168.190.1
请输入用户名:
美国队长
美国队长上线了
欢迎进入聊天室,需要帮助请输入/A
13:42:49 美国队长进入了聊天室!
13:43:06 钢铁侠说:大家好
/a
提示:进入聊天室,默认公聊!!
/L 用户在线列表,用户#信息 私聊,/C 查看聊天记录,/Q 退出系统
/l
在线用户列表:
在线人数为:4
用户名称为:钢铁侠
用户名称为:雷神
用户名称为:奇异博士
用户名称为:美国队长
我们是复仇者联盟
13:43:37 美国队长说:我们是复仇者联盟
13:43:58 雷神对你说:小声点儿
13:45:20 奇异博士说:我要下线了
13:45:50 奇异博士退出了聊天室!
Process finished with exit code 1
网友评论