学习资料来源于慕课网,感谢~
不足之处:
1,未实现多线程;
2,未引入JDBC(用户名、密码相关的操作)。
个人总结:基本掌握了socket通信模型,但是仍然自己无法完完整整的敲出来。还是不熟练的问题。JAVA多人聊天室小项目不容易啊,且行且珍惜吧。
Socket即为套接字地址,用于描述IP+端口地址。
以下是Socket通信模型,个人理解为基本实现步骤:
上面通信模型中提到的I/O相关知识,在之后的学习中,自己会不断跟进、更新。本次只是简单了解加以使用。
查询JDK-9API文档中关于socket和serversocket。
socket:
该类实现客户端套接字(也称为“套接字”)。
套接字是两台机器之间通讯的端点。
套接字的实际工作由socketImpl类的实例执行。
应用程序通过更改创建套接字实现的套接字工厂,可以配置自己创建适合本地防火墙的套接字。
serversocket:
这个类实现了服务器套接字。
服务器套接字等待通过网络进入的请求。
它根据该请求执行一些操作,然后可能将结果返回给请求者。
按照上面给出的实现步骤,以下分别为服务器端和客户端的实现步骤:
代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/*
* 基于TCP协议的Socket通信,实现用户登陆
* 服务器
*/
public class Server {
public static void main(String[] args) {
try {
//1.创建一个服务器端Socket
ServerSocket serverSocket=new ServerSocket(8888);
//2.调用accept方法开始监听,等待客户端的连接
System.out.println("***服务器端即将启动,等待客户端的连接***");
Socket socket=serverSocket.accept();
//3.获取输入流,并读取客户端信息
InputStream is=socket.getInputStream();
InputStreamReader isr =new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String info=null;
while((info=br.readLine())!=null) {
System.out.println("我是服务器,客户端说:"+info);
}
//socket.shutdownInput();
//4.获取输出流,向客户端发送信息
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);//包装为打印刘
pw.write("登陆成功!");
pw.flush();
socket.shutdownOutput();
//4.关闭相关资源
pw.close();
os.close();
br.close();
isr.close();
is.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/*
* 基于TCP协议的Socket通信,实现用户登陆
* 客户端
*/
public class Client {
public static void main(String[] args) {
try {
//1.创建客户端Socket,制定服务器地址和端口
Socket socket=new Socket("192.168.8.9", 8888);
//2.获取输出流,向服务器端发送信息
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);
pw.write("用户名:admin;密码:123");
pw.flush();//刷新缓存
socket.shutdownOutput();//关闭输出流
//3.获取输入流,并读取客户端信息
InputStream is=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String info=null;
while((info=br.readLine())!=null) {
System.out.println("我是客户端,服务器端说:"+info);
}
socket.shutdownInput();
//4.关闭相关资源
br.close();
isr.close();
is.close();
pw.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
注意事项:1,在客户端中寻找同一局域网下IP的方法,两台主机使用同一路由器,直接在路由器管理页面查找服务器端主机Ip即可;
2,服务器端必须先于客户端打开。
实现结果展示:
服务器端:
客户端:
在Console处切换至服务器端: