socket网络编程登录实现及多客户端和服务端的数据交互
一.TCP/IP
客户端
package com.demo.entity;
import java.io.Serializable;
public class UserInfo implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
*
*/
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
package com.demo.entity; import java.io.BufferedInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Scanner; public class UserClient {
private static int port = 5566;
private static String host = "localhost"; public static void main(String[] args) {
Socket socket = null;
// 创建扫描器对象
Scanner sc = null;
try {
sc = new Scanner(System.in);
// 创建一个客户端的Socket对象,获取服务端输入和输出流对象
socket = new Socket(host, port);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
System.out.println("请输入账号:");
String userName = sc.nextLine();
System.out.println("请输入密码:");
String password = sc.nextLine(); // 封装一个用户对象
UserInfo user = new UserInfo();
user.setPassword(password);
user.setUsername(userName); // 序列化到输出流中
oos.writeObject(user); // 释放流资源
oos.flush();
// 读取从服务端返回的数据
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
byte[] buffer = new byte[1024];
int len = 0;
while ((len = bis.read(buffer)) != -1) {
String content = new String(buffer, 0, len);
System.out.println("登录结果:"+content);
} socket.shutdownOutput();
socket.shutdownInput(); } catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (socket != null) {
socket.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
sc.close();
}
}
}
服务器端
package com.demo.entity;
import java.io.Serializable;
public class UserInfo implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
*
*/
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
package com.demo.entity; import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 1、服务器端序列化的对象全名称必须和反序列化的全名称完全一致
* 2、序列化和反序列化对象的序列化Id必须一致
* 3、在网络编程中需要在网络中传输对象必须实现Serializable。
* 4、释放资源的时候流不要使用close方法关闭。
* @author Administrator
*
*/
public class UserServer {
private static int port = 5566; public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
while (true) {
try {
serverSocket = new ServerSocket(port);
System.out.println("等待客户端连接");
// 服务器socket, 可以获取到客户端对应输入流和输出流对象
socket = serverSocket.accept();
System.out.println("端口号:"+socket.getPort());
System.out.println(socket.getInetAddress().getCanonicalHostName() + "连接到了服务器");
// 创建一个反序列化流
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
// 返回客户端序列化的对象
UserInfo user = (UserInfo) ois.readObject();
System.out.println(user.getPassword() + "---" + user.getUsername()); // 获取账号和密码
String account = user.getUsername();
String password = user.getPassword(); // 创建输出流
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream()); // 判断转换和密码是否正确
if ("admin".equals(account) && "123".equals(password)) {
bos.write("登录成功".getBytes());
} else {
bos.write("登录失败".getBytes());
} bos.flush();
bos.close();
ois.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (serverSocket != null) {
serverSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
package com.demo.entity; import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 1、服务器端序列化的对象全名称必须和反序列化的全名称完全一致
* 2、序列化和反序列化对象的序列化Id必须一致
* 3、在网络编程中需要在网络中传输对象必须实现Serializable。
* 4、释放资源的时候流不要使用close方法关闭。
* @author Administrator
*
*/
public class UserServerM {
private static int port = 5555; public static void main(String[] args) throws IOException {
int clientNo = 1; ServerSocket serverSocket = new ServerSocket(port);
// 创建一个缓存线程池
ExecutorService pool = Executors.newCachedThreadPool(); try {
while (true) {
Socket socket = serverSocket.accept();
pool.execute(new SingleServer(clientNo++, socket));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.shutdown();
if (!serverSocket.isClosed()) {
serverSocket.close();
}
} }
} class SingleServer implements Runnable { private int clientNo; // 客户端编号
private Socket socket; public SingleServer(int clientNo, Socket socket) {
this.clientNo = clientNo;
this.socket = socket;
} @Override
public void run() {
System.out.println("第"+clientNo+"客户端连接到了服务器");
System.out.println("port:"+socket.getPort());
System.out.println(socket.getInetAddress().getCanonicalHostName() + "连接到了服务器");
try {
// 创建一个反序列化流
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
// 返回客户端序列化的对象
UserInfo user = (UserInfo) ois.readObject();
System.out.println(user.getPassword() + "---" + user.getUsername()); // 获取账号和密码
String account = user.getUsername();
String password = user.getPassword(); // 创建输出流
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream()); // 判断转换和密码是否正确
if ("admin".equals(account) && "123".equals(password)) {
bos.write("登录成功".getBytes());
} else {
bos.write("登录失败".getBytes());
} bos.flush();
bos.close();
ois.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (!socket.isConnected()) {
socket.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
} }
二.UDP
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; /*
* 客户端
*/
public class UDPClient {
public static void main(String[] args) throws IOException {
/*
* 向服务器端发送数据
*/
// 1.定义服务器的地址、端口号、数据
InetAddress address = InetAddress.getByName("localhost");
int port = 8800;
byte[] data = "用户名:admin;密码:123".getBytes();
// 2.创建数据报,包含发送的数据信息
DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
// 3.创建DatagramSocket对象
DatagramSocket socket = new DatagramSocket();
// 4.向服务器端发送数据报
socket.send(packet); /*
* 接收服务器端响应的数据
*/
// 1.创建数据报,用于接收服务器端响应的数据
byte[] data2 = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(data2, data2.length);
// 2.接收服务器响应的数据
socket.receive(packet2);
// 3.读取数据
String reply = new String(data2, 0, packet2.getLength());
System.out.println("我是客户端,服务器说:" + reply);
// 4.关闭资源
socket.close();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; /*
* 服务器端,实现基于UDP的用户登陆
*/
public class UDPServer {
public static void main(String[] args) throws IOException {
/*
* 接收客户端发送的数据
*/
// 1.创建服务器端DatagramSocket,指定端口
DatagramSocket socket = new DatagramSocket(8800);
// 2.创建数据报,用于接收客户端发送的数据
byte[] data = new byte[1024];// 创建字节数组,指定接收的数据包的大小
DatagramPacket packet = new DatagramPacket(data, data.length);
// 3.接收客户端发送的数据
System.out.println("****服务器端已经启动,等待客户端发送数据");
socket.receive(packet);// 此方法在接收到数据报之前会一直阻塞
// 4.读取数据
String info = new String(data, 0, packet.getLength());
System.out.println("我是服务器,客户端说:" + info); /*
* 向客户端响应数据
*/
// 1.定义客户端的地址、端口号、数据
InetAddress address = packet.getAddress();
int port = packet.getPort();
byte[] data2 = "欢迎您!".getBytes();
// 2.创建数据报,包含响应的数据信息
DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address, port);
// 3.响应客户端
socket.send(packet2);
// 4.关闭资源
socket.close();
}
}
socket网络编程登录实现及多客户端和服务端的数据交互的更多相关文章
- 网络编程 UDP协议 TCP局域网客户端与服务端上传下载电影示例
UDP协议 (了解) 称之为数据包协议,又称不可靠协议. 特点: 1) 不需要建立链接. 2) 不需要知道对方是否收到. 3) 数据不安全 4) 传输速度快 5)能支持并发 6) 不会粘包 7) 无需 ...
- Java基础---Java---网络编程---TCP的传输、客户端和服务端的互访、建立一个文本转换器、编写一个聊天程序
演示TCP的传输的客户端和服务端的互访 需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息. 客户端: 1.建立Socket服务,指定要连接方朵和端口 2.获取Socket流中的输出流,将数 ...
- java在线聊天项目1.1版 ——开启多个客户端,分别实现注册和登录功能,使用客户端与服务端信息request机制,重构线程,将单独的登录和注册线程合并
实现效果图: eclipse项目中初步整合之前的各个客户端和服务端的窗口与工具类,效果如下图: 已将注册服务器线程RegServer功能放到LoginServer中,使用客户端与服务端的request ...
- #Eureka 客户端和服务端间的交互
Eureka 服务器客户端相关配置 1.建立eureka服务器 只需要使用@EnableEurekaServer注解就可以让应用变为Eureka服务器,这是因为spring boot封装了Eureka ...
- Android客户端采用Http 协议Post方式请求与服务端进行数据交互(转)
http://blog.csdn.net/javanian/article/details/8194265
- Python Socket 网络编程 (客户端的编程)
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...
- Socket网络编程(案例)
Socket:套接字 java.net包 1.流式套接字:基于TCP协议的Socket网络编程 工作方式: 1.客户端A连接到服务器: 2.服务器建立连接并把客户端A添加到列表: 3.客户端B.C.. ...
- Python Socket 网络编程
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...
- 基于Socket网络编程
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a2011480169/article/details/73602708 博客核心内容: 1.Sock ...
随机推荐
- C语言文件操作函数之ferror & feof & clearerr
这些函数都是和文件读写时发生错误有关,下面一一分析: 1:ferror 原型:int ferror(FILE * fp) 作用:测试一个文件流是否被设置了错误标识符,如果是返回非 0 整数,否则返回 ...
- 如何解决 不能以 DISTINCT 方式选择 text、ntext 或 image 数据类型
distinct去重,如果遇到text字段,可以用以下方法解决 1.用not exists select * from tab awhere not exists ( select 1 from t ...
- css pointer-event
详见:张鑫旭 CSS3 pointer-events:none应用举例及扩展 pointer-events:none ,可以使事件穿透, 如: 2 覆盖在 1 上面. 给 2 设置 pointer-e ...
- Unity 声音播放不受Time.scale为0的影响
其他会暂停,目前发现声音不受影响 嗯,就这样.
- [USACO07OPEN]Catch That Cow
题目:洛谷P1588.HDU2717 题目大意:有一个人在点$n$,一头牛在点$k$,人每秒能从$x$移动到点$x+1$.$x-1$.$2x$,牛不会动,求最少多少秒后人能移动到牛所在的$k$. 思路 ...
- Python 绘图与可视化 matplotlib(上)
参考链接:https://www.cnblogs.com/dudududu/p/9149762.html 更详细的:https://www.cnblogs.com/zhizhan/p/5615947. ...
- 【 【henuacm2016级暑期训练】动态规划专题 K】 Really Big Numbers
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 会发现如果x是reallynumber那么x+1也会是reallynumber.... (个位数+1,各位数的和+1了但是整个数也+ ...
- php获取当前url地址的方法小结
js 获取: top.location.href //顶级窗口的地址 this.location.href //当前窗口的地址 php获取当前url地址: #测试网址: http://localhos ...
- 【网络协议】TCP协议简单介绍
本文仅仅是对TCP协议做个简要的介绍. TCP协议,即传输控制协议.与UDP协议同处于传输层,相同使用相同的网络层,但TCP提供了一种可靠的.面向连接的传输数据服务,它会在两个使用TC ...
- BestCoder Round #52 (div.2) HDU 5418 Victor and World (DP+状态压缩)
[题目链接]:pid=5418">click here~~ [题目大意]: 问题描写叙述 经过多年的努力,Victor最终考到了飞行驾照. 为了庆祝这件事,他决定给自己买一架飞机然后环 ...