一.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网络编程登录实现及多客户端和服务端的数据交互的更多相关文章

  1. 网络编程 UDP协议 TCP局域网客户端与服务端上传下载电影示例

    UDP协议 (了解) 称之为数据包协议,又称不可靠协议. 特点: 1) 不需要建立链接. 2) 不需要知道对方是否收到. 3) 数据不安全 4) 传输速度快 5)能支持并发 6) 不会粘包 7) 无需 ...

  2. Java基础---Java---网络编程---TCP的传输、客户端和服务端的互访、建立一个文本转换器、编写一个聊天程序

    演示TCP的传输的客户端和服务端的互访 需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息. 客户端: 1.建立Socket服务,指定要连接方朵和端口 2.获取Socket流中的输出流,将数 ...

  3. java在线聊天项目1.1版 ——开启多个客户端,分别实现注册和登录功能,使用客户端与服务端信息request机制,重构线程,将单独的登录和注册线程合并

    实现效果图: eclipse项目中初步整合之前的各个客户端和服务端的窗口与工具类,效果如下图: 已将注册服务器线程RegServer功能放到LoginServer中,使用客户端与服务端的request ...

  4. #Eureka 客户端和服务端间的交互

    Eureka 服务器客户端相关配置 1.建立eureka服务器 只需要使用@EnableEurekaServer注解就可以让应用变为Eureka服务器,这是因为spring boot封装了Eureka ...

  5. Android客户端采用Http 协议Post方式请求与服务端进行数据交互(转)

    http://blog.csdn.net/javanian/article/details/8194265

  6. Python Socket 网络编程 (客户端的编程)

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  7. Socket网络编程(案例)

    Socket:套接字 java.net包 1.流式套接字:基于TCP协议的Socket网络编程 工作方式: 1.客户端A连接到服务器: 2.服务器建立连接并把客户端A添加到列表: 3.客户端B.C.. ...

  8. Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  9. 基于Socket网络编程

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a2011480169/article/details/73602708 博客核心内容: 1.Sock ...

随机推荐

  1. php 生成不重复的随机字符串

    md5(uniqid(md5(microtime(true)),true))

  2. 数据库过滤操作中 != 或者 <> 指定操作数并不能改匹配到NULL值

    数据库过滤操作中 != 或者 <> 指定操作数并不能改匹配到NULL值

  3. CGI与ISAPI的区别(转)

    一 CGI原理及其性能 1) CGI概念CGI即通用网关接口(Common Gateway Interface),它是一段程序,运行在服务器上,提供同客户端HTML页面的交互,通俗的讲CGI就象是一座 ...

  4. POJ 2774 Long Long Message (后缀数组+二分)

    题目大意:求两个字符串的最长公共子串长度 把两个串接在一起,中间放一个#,然后求出height 接下来还是老套路,二分出一个答案ans,然后去验证,如果有连续几个位置的h[i]>=ans,且存在 ...

  5. 二、frps 完整配置文件

    # [common] is integral section [common] # A literal address or host name for IPv6 must be enclosed # ...

  6. nfs+inotify

    服务器先安装nfs服务,因为nfs服务端没有固定端口给客户端访问,所以需要借助rpc服务的111端口给客户端连接,即客户端访问rpc会调用nfs服务 yum -y install rpcbind nf ...

  7. python课堂知识的几点总结

    1.执行python脚本的两种方式:利用python进入解释器和找到可执行文件1.py 2.位和字节:一个字节是8位,计算机运行时是以字节为单位,存储的时候是以位为单位 3.编码发展:ASCII只有0 ...

  8. Hash大法

    内容参考<算法竞赛进阶指南> 之前集训的时候听老师讲过,字符串题目中,hash一般不是正解,但是是一个优秀的暴力,可以拿比较多的部分分. hash涉及内容很多,这里只讨论字符串hash 可 ...

  9. Java并发和多线程4:使用通用同步工具CountDownLatch实现线程等待

    CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 用给定的计数 初始化 CountDownLatch.由于调用了 countDown ...

  10. NYIST 860 又见01背包

    又见01背包时间限制:1000 ms | 内存限制:65535 KB难度:3 描述 有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W 的物品,求所有挑选方案中物品价值总 ...