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 ...
随机推荐
- Android 自定义简单控件--星级评价
效果图 实现 package com.easypass.carstong.view; import android.content.Context; import android.content.re ...
- Python写99乘法表
#!/usr/bin/python# -*- encoding:utf-8 -*- for i in range(1,10): s='' for j in range(1,i+1): ...
- 区间dp+四边形不等式优化
区间dp+四边形优化 luogu:p2858 题意 给出一列数 \(v_i\),每天只能取两端的数,第 j 天取数价值为\(v_i \times j\),最大价值?? 转移方程 dp[i][j] :n ...
- Facebook再次爆出安全漏洞,9000万用户受影响
今年上半年开始,美国社交媒体Facebook因数据泄露事件和涉嫌操纵选举等问题频繁接受听证会拷问,然而事情却远没有结束.今年9月Facebook再次爆出安全漏洞,导致9000万用户可能受到影响. 根据 ...
- org.xml.sax.SAXParseException: Failed to read schema document 的原因分析与解决方法
现象: org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema documen t 'http://www.s ...
- LVS负载均衡三种模式的实现
何为lvs负载均衡? lvs负载均衡(linux virtual server)又名linux虚拟服务器.由章文嵩博士主导的负载均衡项目,目前LVS已经被集成到Linux内核模块中.该项目在Linux ...
- PHP实现的毫秒定时器,同时解决进程不重复堆积
定时器任务,在WEB应用比较常见,如何使用PHP实现定时器任务,大致有两种方案:1)使用Crontab命令,写一个shell脚本,在脚本中调用PHP文件,然后定期执行该脚本:2)配合使用ignore_ ...
- 洛谷 P1147 连续自然数和 (滑动窗口)
维护一个滑动窗口即可 注意不能有m到m的区间,因为区间长度要大于1 #include<cstdio> #define _for(i, a, b) for(int i = (a); i &l ...
- java中的instanceof用法
Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法: ...
- Maven学习总结(25)——Eclipse Maven Update 时JDK版本变更问题
1.新建一个Maven项目JDK版本和系统版本不对应, 2.右键Maven项目->Maven->Update ProjectJDK版本改变了, 3.操作系统的JDK重装了新的版本,这是引起 ...