什么是Socket?
Socket(套接字)可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。
什么是TCP?
TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP旨在适应支持多网络应用的分层协议层次结构。
连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。
什么是UDP?
UDP(用户数据报协议)是一个简单的面向数据报的传输层协议。提供的是非面向连接的、不可靠的数据流传输。
TCP与UDP的区别与联系
区别:
1、 基于连接与无连接。
2、 TCP 要求系统资源较多,UDP较少。
3、 UDP 程序结构较简单 。
4、 TCP 保证数据顺序,UDP不保证 。
5、 TCP 保证数据正确性,UDP可能丢包。
6、 TCP 是面向连接的传输控制协议,而UDP提供了无链接的
实例:
1.客服端向服务端上传一个图片(TDP)
服务端Serve:
/**
* @author bingo
* @ClassName TCPServe.java
* @Description TODO
* @createTime 2020年09月28日
*/
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServe {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(8888); //new一个socket接kou
Socket s = ss.accept(); //接收数据
InputStream in = s.getInputStream(); //写入
FileOutputStream fos = null;
// 1. 接收从客户端发送的数据
in = s.getInputStream();
fos = new FileOutputStream(new File("C:\\Users\\Administrator\\Desktop\\ImageTest\\3.jpg"));
byte[] buffer = new byte[1024];
int length = -1;
while ((length = in.read(buffer)) != -1) {
// 2. 将数据存储到本机
fos.write(buffer, 0, length);
fos.flush();
}
System.out.println("接收完成!请在C:\\Users\\Administrator\\Desktop\\ImageTest\\3.jpg下查看");
s.close(); //停止接收
ss.close(); //接口关闭
}
}
客戶端Client:
/**
* @author bingo
* @ClassName TCPClient.java
* @Description TODO
* @createTime 2020年09月28日
*/
import java.io.*;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) throws IOException {
Socket s=new Socket("127.0.0.1",8888);
OutputStream out =s.getOutputStream();
// 1. 创建一个文件,文件中存储一张图片
FileInputStream fis = null;
BufferedInputStream bis = null;
// 2. 将文件封装成输入流
fis = new FileInputStream(new File("D:\\1.jpg"));
bis = new BufferedInputStream(fis);
// 3. 读取文件,发送给服务器端
byte[] buffer = new byte[1024];
int length = -1;
//判断读取完成
while ((length = bis.read(buffer)) != -1) {
out.write(buffer, 0, length);
out.flush();
}
System.out.println("发送成功!");
s.close();
}
}
2.客服端向服务端发送用户名请求登录,服务端通过验证,返回"欢迎光临",未通过,用户不存在
传输数据和本地数据比较,难点在于如何创建本地数据,new一个user对象
服务端Serve:
/**
* @author bingo
* @ClassName TCPServe.java
* @Description TODO
* @createTime 2020年09月28日
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;
public class TCPServe {
public static void main(String[] args) throws IOException {
// 1.创建服务器端Socket对象
ServerSocket ss=new ServerSocket(8888);
// 2.监听,返回客户端的Socket对象
Socket s=ss.accept();
// 3.得到收入 流,一次可接收一行的输入流
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
// 4.得到数据
String username=br.readLine();
String password=br.readLine();
//封装成User对象
User user=new User(username,password);
// 5.简单校验
boolean flag=false;//校验标记,初始为false
//判断,如果验证成功,改变标准为true否则标记不变
//得到所有User的集合
List<User> users=UserDB.getUser();
//判断集合中是否包含客服端发过来的user对象 使用contains放法 注意重写equals方法
if(users.contains(user))
flag=true;
// 6.得到输出流
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
// 7.发送校验结果
if(flag){
pw.println(username+" "+"欢迎光临");
}
else{
pw.println("用户不存在");
}
// 8.关闭连接
s.close();
ss.close();
}
}
客戶端Client:
/**
* @author bingo
* @ClassName TCPClient.java
* @Description TODO
* @createTime 2020年09月28日
*/
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) throws IOException {
Socket s=new Socket(InetAddress.getLocalHost(),8888);
// 2.得到用户输入的用户名和密码
// 键盘输入两行的内容
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入用户名:");
String username = br.readLine();
System.out.println("请输入密码:");
String password = br.readLine();
// 3.得到输出流
// PrintWriter可实现输入一行自动换行
PrintWriter out = new PrintWriter(s.getOutputStream(), true);
// 4.发送数据
out.println(username);
out.println(password);
// 5.的到输入流
BufferedReader sbr = new BufferedReader(new InputStreamReader(s.getInputStream()));
// 6.得到服务器返回结果并输出
String result = sbr.readLine();
System.out.println(result);
// 7.关闭资源
s.close();
}
}
User对象:
/**
* @author bingo
* @ClassName UserDB.java
* @Description TODO
* @createTime 2020年09月28日
*/
import java.util.ArrayList;
import java.util.List;
public class UserDemo {
//创建静态user对象users
private static List<User> users=new ArrayList<User>();
static{
//add()添加用户
users.add(new User("zhangbin","123456"));
users.add(new User("lisi","123456"));
users.add(new User("wangwu","123456"));
}
public static List<User> getUser(){
return users;
}
}
/**
* User对象类
*/
class User {
private String username;
private String password;
public User(){}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (password == null) {
if (other.password != null)
return false;
} else if (!password.equals(other.password))
return false;
if (username == null) {
if (other.username != null)
return false;
}
else if (!username.equals(other.username))
return false;
return true;
}
/*
*含参构造函数
*/
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
/*
*set,get方法
*/
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;
}
}