网络编程详解-TCP

  一,TCP协议的特点 
              面向连接的协议(有发送端就一定要有接收端)

     通过三次连接握手建立连接

  通过四次握手断开连接

  基于IO流传输数据

  传输数据大小没有限制

  速度慢但可靠

  二,TCP协议相关的两个类
       Socket(一个socket对象表示一个客户端对象)
             常用构造方法介绍

   Socket(String host, int  port)

        host参数为服务器的ip地址字符串

       port参数为服务器的端口号

  大家记忆的时候可以使用这一种记忆方式 :记住socket是个客户端对象就可以了,参数就想socket对象既然是客户端对象他就需要连接服务器,那么他需要什么呢,连接服务器肯定需要服务端的IP和地址才能够连接。

  三,常用方法介绍

  OutputStream    getOutputStream() 获取字节输出流(该字节输出可以向服务端输出数据,只能获取一次,调用该方法多少次,获取到的还是同一个对象)
  InputStream   getInputStream() 获取字节输入流(该字节输入流可以读取服务器端方式过来的数据,只能获取一次,调用该方法多少次,获取到的还是同一个对象)
  void   shutdownOutputStream() 关闭输出流(在socket里面作用就是告诉服务器端,数据已经传输完成,调用该方法以后获取到的输出流就不能使用了)
  void  close() 关闭资源
  int  getPort() 获取服务器端的端口
  InetAddress getInetAddress()

  四,获取服务器端的IP地址对象

   ServerSocket(一个该类对象就代表一个服务端对象)
                      常用构造方法介绍

      ServerSocket(int port)

      port参数为服务端的端口号

   常用方法介绍

       Socket  accept() 等待客户端连接,获取一个客户端对象
       InteAddress    getInteAdderss() 获取连接的客户端的ip对象
  

  五,网络编程(TCP-服务端响应客户端)代码

         1.客户端代码

 import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner; public class UserClint_3 {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) throws IOException {
//1.创建客户端套接字
Socket s = new Socket("localhost", 152);
//2.创建客户端输出流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//3.用户输入用户和密码,并写入输出流
System.out.println("请输入用户名:");
String user = sc.nextLine();
System.out.println("请输入用户密码:");
String password = sc.nextLine();
bw.write(user);
bw.flush();
bw.newLine();
bw.write(password);
bw.flush(); //4.通知服务端客户端用户信息写入完毕
s.shutdownOutput(); //5.创建输入流来接受服务端响应的信息
BufferedReader br= new BufferedReader(new InputStreamReader(s.getInputStream()));
String info = br.readLine();
//6.输出响应信息
System.out.println(info);
//7.关闭套接字
s.close();
}
}

  2.将客户登录信息放在在User.Properties文件中,持久化信息库 

 username=lsx
pwd=123
username=wn
pwd=123

  3.服务器端代码

 import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties; public class UserServer_3 {
public static Map<String, String> User() throws IOException{
//将用户信息存放在User.properties文件中
//创建properties类获取用户信息
Properties p = new Properties();
//通过load()方法读取用户信息
p.load(new FileInputStream("User.Properties"));
//通过getProperty()方法获取用户信息的键,得到用户信息的值
String user = p.getProperty("username");
String pwd = p.getProperty("pwd"); //创建map集合,将用户信息的键以及对应的值放入集合中
Map<String, String> map = new HashMap<>();
map.put("username", user);
map.put("pwd", pwd);
return map;
}
public static void main(String[] args) throws IOException {
//1.创建服务器端套接字
ServerSocket ss = new ServerSocket(152);
//2.监听客户端套接字
Socket s = ss.accept();
//3.创建输入流用来读取客户端发送的用户信息
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
//4.读取客户端发送的用户信息
String username = br.readLine();
String password = br.readLine(); //5.调用map集合,拿到map集合里面的用户信息和客户端发送的信息进行比对
Map<String, String> map = User();
//6.创建输出流用来响应客户端
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//7.进行信息比对
if(map.get("username").equals(username)&&map.get("pwd").equals(password)){
//8.写入响应信息
bw.write("恭喜您,登录成功!");
bw.flush();
}else{
bw.write("登录失败,用户或用户密码错误!");
bw.flush();
}
//9.关闭客户端套接字
s.close();
}
}

java容器和数据结构详解:链接:https://pan.baidu.com/s/1jR9neu9JuTy4UpBN1p83bQ  提取码:lutu 

java网络编程(TCP详解)的更多相关文章

  1. java网络编程(UDP详解)

    UDP详解 一,TCP/IP协议栈中,TCP协议和UDP协议的联系和区别? 联系: TCP和UDP是TCP/IP协议栈中传输层的两个协议,它们使用网络层功能把数据包发送到目的地,从而为应用层提供网络服 ...

  2. java并发编程 | 锁详解:AQS,Lock,ReentrantLock,ReentrantReadWriteLock

    原文:java并发编程 | 锁详解:AQS,Lock,ReentrantLock,ReentrantReadWriteLock 锁 锁是用来控制多个线程访问共享资源的方式,java中可以使用synch ...

  3. java 网络编程-tcp/udp

    --转自:http://blog.csdn.net/nyzhl/article/details/1705039 直接把代码写在这里,解释看这里吧:http://blog.csdn.net/nyzhl/ ...

  4. Java网络编程——TCP/UDP

    UDP:面向无连接 ☆ 将数据及源地址和目的地址封装成数据包中 ☆ 每个数据报的大小限制在64K ☆ 不可靠协议 ☆ 不需要建立连接,速度快 TCP:面向有连接 ☆ 建立连接,形成传输数据的通道 ☆ ...

  5. java网络编程TCP传输—流操作—拿到源后的写入动作

    在网络编程中的TCP传输里,拿到Socket的源后,应该怎么进行读写操作呢,下面我列举了两种方法,希望大家帮忙补充···· 1.利用byte数组作为一个缓冲区进行读写 客户端上传 //获取socket ...

  6. java并发编程 | 线程详解

    个人网站:https://chenmingyu.top/concurrent-thread/ 进程与线程 进程:操作系统在运行一个程序的时候就会为其创建一个进程(比如一个java程序),进程是资源分配 ...

  7. Java分享笔记:Java网络编程--TCP程序设计

    [1] TCP编程的主要步骤 客户端(client): 1.创建Socket对象,构造方法的形参列表中需要InetAddress类对象和int型值,用来指明对方的IP地址和端口号. 2.通过Socke ...

  8. Java网络编程(TCP客户端)

    TCP传输:两个端点建立连接后会有一个传输数据的通道,这个通道就称为流,而且是建立在网络基础上的流,之为socket流,该流中既可以读取也可以写入. TCP的两个端点:一个客户端:ServerSock ...

  9. JAVA网络编程TCP通信

    Socket简介: Socket称为"套接字",描述IP地址和端口.在Internet上的主机一般运行多个服务软件,同时提供几种服务,每种服务都打开一个Socket,并绑定在一个端 ...

随机推荐

  1. ssh 登陆 端口转发

    man ssh ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] ...

  2. jQuery基础笔记(1)

    day54 参考:https://www.cnblogs.com/liwenzhou/p/8178806.html 1. 为什么要学jQuery?  MySQL Python              ...

  3. Java自学路线

    万事开头难,学习Java亦是如此.而在学习的开始,选择正确的学习路线更是尤为重要.在本文中我将分享本人自学转行路上的学习路线,希望能给想自学,却不知道方向的同学带来帮助~ 1 .JavaSE 基础 这 ...

  4. centos6.5 yum安装lamp

    准备篇: 1.清空防火墙 iptables -F 或者关闭防火墙 /etc/init.d/iptables stop,如果要防火墙开机不要启动 chkconfig iptables off 2.关闭S ...

  5. 查看服务器CPU的个数、CPU的核数、多核超线程数、机器硬件型号

    这里有几个概念: 1.一台物理机的物理CPU的个数 2.一个CPU上的核数 3.一个核上面支持的线程数 有下面的计算公式: # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 ...

  6. .Net - WebApi

    WebApi C#进阶系列 - WebApi: WebApi 服务监控 + log4net:

  7. vue项目在IE下报 [vuex] vuex requires a Promise polyfill in this browser问题

    如下图所示,项目在IE11下打开报错: 因为使用了 ES6 中用来传递异步消息的的Promise,而IE浏览器都不支持. 解决方法: 第一步: 安装 babel-polyfill . babel-po ...

  8. 四则运算2及psp0设计

    随机生成运算式,要求: 1.题目避免重复. 2.可定制(数量/打印方式). 3.可以控制一下参数. 要求:是否有乘除法,是否有括号,数值范围,加减有无负数,除法有无余数. 刚开始看到这样一个题目感觉还 ...

  9. sql 获取列名

    --查询所有列 select name from syscolumns where id=OBJECT_ID('PTS_ProjectTask') --列转为行 GetColumnJoin 'Proj ...

  10. 07-python链接mysql

    python3 中使用的是 PyMySQL模块, 取代了之前的 MysqlDB 模块, 其实使用都是一样的, 如果没有该模块的, 需要使用pip命令进行安装 pip install PyMySQL 安 ...