Java修炼——基于TCP协议的Socket编程_双向通信_实现模拟用户登录
首先我们需要客户端和服务器端。
服务器端需要:1.创建ServerSocket对象。2.监听客户端的请求数据。3.获取输入流(对象流)即用户在客户端所发过来的信息。 4.创建用户对象。5.判断用户信息是否正确。6.获取输出端,反馈用户信息。9.关闭流。
客户端需要:1.创建Socket对象。2.获取输出流(对象流)。3.创建用户对象,并且赋值。4.将用户数据发送给服务器端。5.获取输入 流,用来接收服务器端返回的数据。6.关闭流。
我们将用户的信息序列化,因此次在服务器接收数据时,需要反序列化。
User类:
package com.bjsxt.entity;
import java.io.Serializable;
public class User implements Serializable{
/**
*
*/
private static final long serialVersionUID = -3217779599604368894L;
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User(String name, String password) {
super();
this.name = name;
this.password = password;
}
public User() {
super();
}
}
Client类:
package com.bjsxt.entity;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
//1.创建socket对象,用于连接服务器
Socket client=new Socket("192.168.41.29", 8888);
//2.获取输出流(对象流)
ObjectOutputStream oos= new ObjectOutputStream(client.getOutputStream());
//3.创建user对象(调用获取对象的方法)
User u=getUser();
//4.将user对象发送到服务器中
oos.writeObject(u);
//5.获取输入流(数据流)
DataInputStream dis=new DataInputStream(client.getInputStream());
System.out.println(dis.readUTF());
//6.关闭流,关闭socket
if (dis!=null) {
dis.close();
}
if (oos!=null) {
oos.close();
}
if (client!=null) {
client.close();
}
}
public static User getUser() {
Scanner input=new Scanner(System.in);
System.out.println("请输入用户名:");
String name = input.next();
System.out.println("请输入密码:");
String password = input.next();
return new User(name, password);
}
}
Server类:
package com.bjsxt.server;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
import com.bjsxt.entity.User;
import com.bjsxt.thread.ServerThread;
public class Server {
public static void main(String[] args) throws IOException, ClassNotFoundException {
System.out.println("--------------服务器已启动,等待客户端连接---------------");
//1.创建ServerSocket对象
ServerSocket server=new ServerSocket(8888);
while (true) {
//2.监听客户端的请求
Socket socket = server.accept();
ServerThread st=new ServerThread(socket);
new Thread(st).start();
}
}
}
ServerThread类(为了实现多线程,很多客户端访问同一个服务器端。)
package com.bjsxt.thread;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;
import com.bjsxt.entity.User;
public class ServerThread implements Runnable{
private Socket socket;//成员变量
public ServerThread(Socket socke) {
this.socket=socke;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"请求登录。");
//3.获取输入流(对象流)
ObjectInputStream ois=null;
//5.获取输出流(数据流),反馈给客户端登录信息
DataOutputStream dos=null;
try {
ois = new ObjectInputStream(socket.getInputStream());
User user =(User) ois.readObject();
System.out.println(socket.getInetAddress().getHostAddress()+"请求登录\t用户名:"+user.getName()+"\t密码:"+user.getPassword());
String str="";
//4.对用户名和密码进行验证
if ("yxf".equals(user.getName())&&"123".equals(user.getPassword())) {
str=user.getName()+"登录成功!";
}else {
str="登录失败!账号或密码有误!";
}
dos = new DataOutputStream(socket.getOutputStream());
dos.writeUTF(str);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//6.关闭流,
if (dos!=null) {
try {
dos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (ois!=null) {
try {
ois.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (socket!=null) {
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
项目工程截图:

说明:由于User类是序列化 的,因此我们需要在/serverLoginProject项目中建立一个一模一样的User类,包也要是一样的。里面的内容就是拷贝的。
运行截图:因为是多线程所以可以多启动几次客户端,进行模仿多用户登录


Java修炼——基于TCP协议的Socket编程_双向通信_实现模拟用户登录的更多相关文章
- Java:基于TCP协议网络socket编程(实现C/S通信)
目录 一.前言:TCP原理简介 二.Socket编程通信 三.TCP服务器端(具体代码) 四.TCP客户端(具体代码) 五.通信效果演示 六."创意"机器人:价值一个亿的AI核心代 ...
- 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程
Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...
- 基于TCP协议的socket编程
什么是socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面, ...
- 基于TCP协议之socket编程
#服务端 #导入一个socket模块 import socket #想象成买手机打电话:socket.SOCK_STREAM 表示建立tcp连接 ,udp连接socket.SOCK_DGRAM #买了 ...
- 基于TCP/UDP的socket编程
基于TCP(面向连接)的socket编程服务器端顺序: 1. 创建套接字(socket) 2. 将套接字绑定到一个本地地址和端口上(bind) 3. 将套接字设为监听模式,准备接收客户请求(liste ...
- 基于TCP(面向连接)的Socket编程
基于TCP(面向连接)的Socket编程 一.客户端: 1.打开一个套接字(Socket); 2.发起连接请求(connect); 3.如果连接成功,则进行数据交换(read.write.send.r ...
- 基于TCP 协议的socket 简单通信
DNS 服务器:域名解析 socket 套接字 : socket 是处于应用层与传输层之间的抽象层,也是一组操作起来非常简单的接口(接受数据),此接口接受数据之后,交由操作系统 为什么存在 soc ...
- (4)socket的基础使用(基于TCP协议的并发编程)
需要实现并发需要依靠socketserver 模块 socketserver模块下有几个功能 def __init__(self, request, client_address, server): ...
- 基于TCP协议的socket套接字编程
目录 一.什么是Scoket 二.套接字发展史及分类 2.1 基于文件类型的套接字家族 2.2 基于网络类型的套接字家族 三.套接字工作流程 3.1 服务端套接字函数 3.2 客户端套接字函数 3.3 ...
随机推荐
- vue使用一些外部插件及样式的配置
一.配置全局css及js样式 1.首先将事先写好的css文件及js文件放在src文件目录下的assets文件下 2.在main.js文件输上图右边两个红色框的代码 二.配置全局jQuery及boots ...
- C# II: Class ViewModelBase and RelayCommand in MVVM
好久不写WPF和MVVM,新建一个Project后,想起来ViewModelBase和RelayCommand没有.以下Code摘自MSDN上的Article:Patterns - WPF Apps ...
- 三张关联表,大表;单次查询耗时400s,有group by order by 如何优化
问题SQL: select p.person_id as personId, p.person_name as personName, p.native_place as nativePlace, c ...
- mongodb基本命令,mongodb集群原理分析
mongodb基本命令,mongodb集群原理分析 集合: 1.集合没有固定数据格式. 2. 数据: 时间类型: Date() 当前时间(js时间) new Date() 格林尼治时间(object) ...
- # & 等特殊字符会导致传参失败
# & 等特殊字符会导致 post 传参失败 处理方法使用 encodeURIComponent 将字符串转化一下 实例 // toUpperCase() 转化为大写字母 var cateco ...
- PHP 富文本解码为 HTML 并显示
PHP 富文本解码为 HTML 并显示 使用 html_entity_decode 函数 参考文档 PHP实例: // html_entity_decode(待解码内容, 如何处理引号) html_ ...
- nyoj 209 + poj 2492 A Bug's Life (并查集)
A Bug's Life 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 Background Professor Hopper is researching th ...
- 领扣(LeetCode)错误的集合 个人题解
集合 S 包含从1到 n 的整数.不幸的是,因为数据错误,导致集合里面某一个元素复制了成了集合里面的另外一个元素的值,导致集合丢失了一个整数并且有一个元素重复. 给定一个数组 nums 代表了集合 S ...
- C# 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”
“Microsoft.Jet.OLEDB.4.0” 是数据库接口驱动,用来连接数据库的,一般多用于连Access和Excel.我在在winform开发时,在本地运行没有问题,可是部署到另一台服务器上就 ...
- 20191031-9 beta week 1/2 Scrum立会报告+燃尽图 07
此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9917 一.小组情况 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 韩昊 ...