——- android培训、java培训、期待与您交流! ———-
TCP:
1、建立连接,形成传输数据的通道。(面向连接)三次握手机制
2、在连接中进行大数据两传输()
3、通过三次握手完成连接,是可靠协议
4、必须建立连接,效率会稍低Socket:
1、Socket就是为网络服务提供的一种机制。
2、通信的两端都有Socket。
3、网络通信其实就是Socket间的通信。
4、数据在两个Socket间通过IO传输。
一、Socket类
1、定义:
此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
注:套接字的实际工作由 SocketImpl 类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。
2、常用方法:
常用的方法如下:
Socket(String host, int port) -> 创建一个流套接字并将其连接到指定主机上的指定端口号。
close() -> 关闭此套接字。
getInetAddress() -> 返回套接字连接的地址。
getInputStream() -> 返回此套接字的输入流。
getPort() -> 返回此套接字连接到的远程端口。
shutdownOutput() -> 禁用此套接字的输出流。
二、ServerSocket类
1、定义:
此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
注:服务器套接字的实际工作由 SocketImpl 类的实例执行。应用程序可以更改创建套接字实现的套接字工厂来配置它自身,从而创建适合本地防火墙的套接字。
2、常用方法:
常用的方法如下:
ServerSocket(int port) -> 创建绑定到特定端口的服务器套接字。
accept() -> 侦听并接受到此套接字的连接。
close() -> 关闭此套接字。
getInetAddress() -> 返回此服务器套接字的本地地址。
代码块
练习:客户端通过键盘录入用户名,服务端对这个用户名进行校验。
package com.itheima4;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 需求:
* 客户端通过键盘录入用户名。
* 服务端对这个用户名进行校验。
*
* 如果该用户存在,则服务端显示xxx,已登陆。
* 并在客户端显示xxx,欢迎光临。
*
* 如果该用户不存在,则服务端显示xxx,尝试登陆。
* 并在客户端显示xxx,该用户不存在
*
* 最多登陆三次
*
* 客户端:
* 1、建立连接。
* 2、关联标准输入。
* 3、读完后发给服务器端。
* 4、读取反馈信息。
* 5、关闭资源。
*
* @author jjy
*
*/
class LoginClient{
public static void main(String[] args)throws Exception{
Socket s = new Socket("127.0.0.1",10001);
//键盘输入
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
//服务器端的网络发送
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
//接收服务器端的反馈信息
BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
//最多登陆三次
for(int x=0;x<3;x++){
//获得键盘输入的字符串
String line=bufr.readLine();
System.out.println("输入的姓名为:"+line);
if(line==null)
break;
//往服务器端网络发送
out.println(line);
//接收反馈信息
String info = bufIn.readLine();
System.out.println("info:"+info);
//若"反馈信息"中包含"欢迎"两字,则退出循环
if(info.contains("欢迎"))
break;
}
//关闭资源
bufr.close();
s.close();
}
}
class LoginThread implements Runnable{
private Socket s;
LoginThread(Socket s){
this.s=s;
}
public void run(){
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"....connected.");
try{
//最多登陆三次
for(int i=0;i<3;i++){
//接收客户端发送的套接字
BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
//获得客户端发送的套接字
String name = bufIn.readLine();
if(name==null)
break;
//关联到本地d盘下的user.txt文件
BufferedReader bufr = new BufferedReader(new FileReader("D:\\user.txt"));
//客户端的网络套接字
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
String line = null;
boolean flag = false;
//循环读取d盘下user.txt文件中字符串
while((line=bufr.readLine())!=null){
//如果相同,则修改标记,然后退出循环
if(line.equals(name)){
flag = true;
break;
}
}
if(flag){
System.out.println(name+",已登录");
out.println(name+",欢迎光临");
break;
}else{
System.out.println(name+",尝试登陆");
out.println(name+",用户名不存在");
}
}
//关闭资源
s.close();
}catch(Exception e){
throw new RuntimeException(ip+"校验失败");
}
}
}
class LoginServer{
public static void main(String[] args)throws Exception{
ServerSocket ss = new ServerSocket(10001);
//通过多线程的方法,支持多个请求。
while(true){
//接收客户端发过来的套接字
Socket s = ss.accept();
//开启线程
new Thread(new LoginThread(s)).start();
}
}
}
public class LoginDemo{
public static void main(String[] args)throws Exception{
}
}