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中的事件分发机制
Android中的事件分发机制 作者:丁明祥 邮箱:2780087178@qq.com 这篇文章这周之内尽量写完 参考资料: Android事件分发机制完全解析,带你从源码的角度彻底理解(上) And ...
- intell-
intellect: n.[U, C] the ability to think in a logical way and understand things, especially at an ad ...
- poj 2762 Going from u to v or from v to u? 【 强连通 拓扑排序】
给出n个点,m条边,问是否任意两点u,v,是否满足u能够到达v,或者v能够到达u 自己写的时候以为缩一下点,然后再判断一下能不能拓扑排序就可以了 但是--wa--- 后来看了这篇题解 http://e ...
- ZBrush中物体的显示与隐藏
在ZBrush®中除了遮罩功能可以对局部网格进行编辑外,通过显示和隐藏局部网格也可以对局部进行控制.选择网格的控制都是手动操作,在软件中并没有相应的命令进行操作.选择局部网格的工作原理也很简单,即被选 ...
- css——导航栏
导航栏一般用无序列表制作 但出来的导航栏有黑点,还有一些边距 去除黑点我们可以用:list-style-type: none;/*去掉ul前面的点*/ 因为有些标签之间会有默认的边距,所以可以先将边踞 ...
- windows下一台机器运行多个tomcat
一.将本机原有的tomcat配置不变, 二.下载新的tomcat解压版,地址:http://tomcat.apache.org/download-80.cgi 三.下载完成解压后,为了方便区分,最好将 ...
- 洛谷 P1582 倒水 (二进制)
这道题实际上是考二进制 很容易看出杯子水量一定是2的i次方 所以n杯水最后剩下的水一定是n用二进制表示中1的个数 所以就枚举n来求什么时候1的个数小于k 那么这里有个优化,不然会超时 因为每次加的目的 ...
- C# 上位机的USB设备拔插检测
我们做USB通信时,通信成功后,往往要检测USB设备的拔插状态,这里就USB拔插进行一下说明. 参考:https://www.imooc.com/article/17438 先说明一下,我这里只是用C ...
- Spring中使用Quartz之MethodInvokingJobDetailFactoryBean配置任务
Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz. Spring中使用Quartz的3种方法(MethodInvokingJobDetailFactoryBean,i ...
- oracle用户锁定
https://www.cnblogs.com/lostyue/archive/2011/12/06/2278063.html