网络编程TCP协议–Java学习笔记
在计算机中,通过IP协议,可以和将不同类型的计算机和操作系统连接,,他负责将消息,从一个主机,传到另一个主机,消息在传输过程中被分割成一个个小包,但不能解决在分组传输中可能出现的问题,TCP 协议是一种端对端的可靠的协议,TCP协议会在两台连接好的计算机之间一个信息传递通道,并负责收集信息包,按适当的顺序放好传输。
建立连接时,两端都要创建一个Socket并且必须要有一端,主动接受别人的连接,另一端去连接,当连接成功后,两个主机之间没有明确的服务端和客户端之分。
这种连接类似于打电话,必须有一方可以被呼叫,一方去呼叫,两边都接听了,链接就建立了,任意一方挂电话,连接就终止了。
1、 ServerSocket,创建一个可以接收Socket连接请求的类,
创建类
ServerSocket server01=new ServerSocket(9999);//9999是自己设置的端口
重要方法:
accept(),监听,如果收到一个连接请求,就返回一个Socket对象,否则就一直等待,阻塞式接收。
close() 用于关闭 ServerSocket
2、 使用Socket进行通信
1、 创建一个Socket连接
Socket client=new Socket(“localhost”,9999);//用于连接本机的端口为9999的Socket
2、 执行这行代码,就会和之前接收端建立联系通道。
3、 获取流:
Socket提供了输入流和输出流,都是字节流:getInputStream()/getOutputStream()
4、 使用相应的流操作完成通信;
3、 建立连接后,两端具有对等的地位,都可以与另一端接收和发送消息,这一点区别于UDP协议;
代码 :
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
//命名为LogServer是因为监听端在这个类中,这个Server区别于UDP协议中的服务端
public class LogServer {
public static void main(String[] args) throws Exception {
ServerSocket server=new ServerSocket(8888);
Socket client=server.accept();
System.out.println("一个客户端建立了连接");
DataInputStream dis=new DataInputStream(client.getInputStream());
String datas=dis.readUTF();
String dataArrays[]=datas.split("&");
String st1="",st2="";
for(String tmp :dataArrays){
String datainfor[]=tmp.split("=");
if(datainfor[0].equals("uname")){
System.out.println("用户名:"+datainfor[1]);
st1=datainfor[1];
}else if(datainfor[0].equals("pwd")){
System.out.println("密码为:"+datainfor[1]);
st2=datainfor[1];
}
}
DataOutputStream dom=new DataOutputStream(client.getOutputStream());
if(st1.equals("xiwuzr")&&st2.equals("123456789"))
{
dom.writeUTF("登录成功");
dom.flush();
}else{
dom.writeUTF("登录失败");
dom.flush();
}
dis.close();
server.close();
}
}
import java.io.*;
import java.net.Socket;
public class LogClient {
public static void main(String[] args) throws Exception {
Socket client=new Socket("localhost",8888);
BufferedReader read=new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入用户名:");
String uname=read.readLine();
System.out.println("请输入密码: ");
String pwd=read.readLine();
DataOutputStream dom=new DataOutputStream(client.getOutputStream());
dom.writeUTF("uname="+uname+'&'+"pwd="+pwd);
dom.flush();
DataInputStream dis=new DataInputStream(client.getInputStream());
String datas=dis.readUTF();
System.out.println(datas);
client.close();
dom.close();
}
}