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 ...
随机推荐
- OpenCart 如何安装 vQmod 教程
vQmod (全称 Virtual Quick Mod),是 OpenCart (PHP 开源电商网站系统)上一个可以以虚拟方式修改原文件内容而设计的一个插件系统.它的使用很简单,我们先用 xml 的 ...
- JS中通过LayUI的layer.prompt弹出文本输入层,多个按钮回调获取输入值
JS中通过LayUI弹出文本输入层,多个按钮回调: 如图所示,输入文本后点击通过/不通过按钮回调获取输入文本值的实现: 实现JS: layer.prompt({ formType: 2, // 弹出文 ...
- 注解实战aftersuite和beforesuite
package com.course.testng;import org.testng.annotations.*; public class BasicAnnotation { //最基本的注解,用 ...
- mac上用VMWare虚拟机装Linux-Ubuntu
1.下载vmware fusion for Mac 网上有很多,大家自己找吧 2.安装Vmware 3.序列号可以在网上找,或者淘宝几块钱买一个(记得买对应版本的) 4.之后就下一步,完成就好 安装U ...
- 从YV12到NV12
Media SDK的decoder,vpp,encoder对输入输出格式有着严格的限制,现在仅仅支持NV12.那么如何从其他格式转化为NV12是日常工作中经常遇到的事情.本篇文章以此为目的,讨论如何将 ...
- Vue生命周期函数的应用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- C# .net IDE Rider入门
话说史上最强IDE Visual Studio 所向披靡数十载尚无敌手,现在Intellij带着统一IDE界的目标来挑战VS的霸主地位.了解Rider后发现,哎哟亮点多多,还不错哦! Rider是一款 ...
- HDU 4303 Contest 1
说实话,挺复杂的一道题. 我采用栈的方式,DFS在搜索完一个节点的所有子结点后,通过排序,加快计算该结点所有可能的路径:子结点与子结点的连通,子结点与父结点的连通,通过父结点与各祖先结点的连通.同时记 ...
- 字符串中连续出现最多的子串 & 字符串中最长反复子串
字符串中连续出现最多的子串 & 字符串中最长反复子串 字符串中连续出现最多的子串 & 字符串中最长反复子串,这两个问题都能够用后缀数组来表示,至于后缀数组能够參考编程珠玑P156:后缀 ...
- cf #257(Div.2) A. Jzzhu and Children
A. Jzzhu and Children time limit per test 1 second memory limit per test 256 megabytes input standar ...