Java基础(二十三)网络编程

本文介绍了Java网络编程的基础知识,包括套接字、IP地址、端口号和传输协议的概念。通过示例展示了UDP和TCP协议的发送与接收数据过程,涵盖了DatagramSocket、DatagramPacket、Socket和ServerSocket等类的使用。此外,还演示了用户登录模拟场景,涉及TCP连接、数据交换及验证逻辑。
摘要由CSDN通过智能技术生成

网络编程
socket(套接字 IP地址+端口)
网络通信三要素
IP地址、端口号、传输协议
InetAddress

/InetAddress:此类表示互联网协议
public class InetDemo {
public static void main(String[] args) throws UnknownHostException {
	InetAddress ia=InetAddress.getLocalHost();
	System.out.println(ia);
}
}

UDP发送端

/*使用UDP协议发送数据
 * 创建发送端socket对象
 * DatagramSocket此类表示用来发送和接收数据报包的套接字,基于UDP
 * 创建数据并打包
 * DatagramPcket:此类表示数据报包
 * 数据byte[]
 * 设备ip
 * DatagramPacket(byte[] buf, int length, InetAddress address, int port) 
          构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
 * 进程地址 端口号
 * 发送数据
 * 释放资源*/
public class UdpDemo {
public static void main(String[] args) throws IOException {
	DatagramSocket ds=new DatagramSocket();
	String s="高薪就业";
	byte[]bys=s.getBytes();
	int lenth=bys.length;
	InetAddress ia= InetAddress.getByName("LAPTOP-ICK2OD8O");
	int port=8888;
	DatagramPacket dp=new DatagramPacket(bys,lenth,ia,port);
	ds.send(dp);
	ds.close();
}
}

接受数据


//UDP接收数据
/*创建接收端Socket对象
 * 接收数据
 * 解析数据
 * 输出数据
 * 释放资源*/
public class UdpDemo_02 {
public static void main(String[] args) throws IOException {
	DatagramSocket ds=new DatagramSocket(8888);
	byte[]bys=new byte[1024];
	DatagramPacket dp=new DatagramPacket(bys, bys.length);
	System.out.println(1);
	ds.receive(dp);
	System.out.println(2);
	//解析数据
	InetAddress ia=dp.getAddress();//获取发送端的ip
	byte[]data=dp.getData();//获取发送端的数据
	int len=dp.getLength();//获取发送端的数据长度
	System.out.println("sender----->"+ia.getHostAddress());
	System.out.println(new String(data,0,len));
	ds.close();
}
}

TCP发送数据
ClientDemo.java


import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

/*使用TCP发送数据
 * 创建发送端Socket对象
 * Socket(InetAddress address, int port) 
   创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
 * 获取输出流数据对象
 * 发送数据
 * 释放资源
 * Exception in thread "main" java.net.ConnectException: Connection refused: connect*/
public class ClientDemo {
public static void main(String[] args) throws UnknownHostException, IOException {
	//创建发送端Socket对象
	Socket s=new Socket(InetAddress.getByName("LAPTOP-ICK2OD8O"), 10086);
	//获取输出流数据对象
	OutputStream os=s.getOutputStream();
	String str="Hello, TCP i m coming!!!";
	//发送数据
	os.write(str.getBytes());
	//释放资源
	s.close();
	os.close();
}
}

ServerDemo

/*TCP协议接收数据
 * 创建接收端Socket对象
 * 监听
 * 获取输入流对象
 * 获取数据
 * 输出数据
 * 释放资源*/
public class ServerDemo {
public static void main(String[] args) throws IOException {
	//创建接收端Socket对象
	ServerSocket ss=new ServerSocket(10086);
	//监听
	Socket s=ss.accept();
	//获取输入流对象
	InputStream is=s.getInputStream();
	//获取数据
	byte[]bys=new byte[1024];
	int len;
	len=is.read(bys);
	//输出数据
	InetAddress add=s.getInetAddress();
	System.out.println("client------>"+add.getHostName());
	System.out.println(new String(bys,0,len));
	
	//释放资源
	s.close();
	
}

需求:使用TCP协议发送数据,并将接收到的数据转换成大写返回

/*需求:使用TCP协议发送数据,并将接收的数据转换成大写返回
 * 客户端发送数据
 * 服务端接收数据
 * 服务端转换数据
 * 服务端发出数据
 * 客户端接收数据*/
public class ClientDemo {
public static void main(String[] args) throws IOException, IOException {
	//创建发送端套接字
	Socket s=new Socket(InetAddress.getByName("LAPTOP-ICK2OD8O"), 10087);
	//创建发送端输入流对象
	OutputStream os=s.getOutputStream();
	//发送数据
	os.write("Hello,i mc coming again!!!".getBytes());
	//接收数据
	//创建输入流对象
	InputStream is=s.getInputStream();
	byte[]bys=new byte[1024];
	int len;
	len=is.read(bys);
	//输出数据
	System.out.println(new String(bys,0,len));
	//释放资源
	s.close();
}
}

Server

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerDemo {
public static void main(String[] args) throws IOException {
	//创建服务端套接字对象
	ServerSocket ss=new ServerSocket(10087);
	//监听
	Socket s=ss.accept();
	//创建输入流对象
	InputStream is=s.getInputStream();
	byte[]bys=new byte[1024];
	int len;
	len=is.read(bys);
	String str=new String(bys,0,len);
	//输出数据
	System.out.println(str);
	//数据转换
	String uppstr=str.toUpperCase();
	//创建输出流对象
	OutputStream os=s.getOutputStream();
	//发送数据
	os.write(uppstr.getBytes());
	//释放资源
	s.close();
}
}

模拟用户登录

User类

public class User {
private String username;
private String password;



public User() {
	super();
	// TODO Auto-generated constructor stub
}



public User(String username, String password) {
	super();
	this.username = username;
	this.password = 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;
}






@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;
}








}

UserDB类


public class UserDB {
 private static List<User>users=new ArrayList<User>();
 static {
	 users.add(new User("zhangsan","123456"));
	 users.add(new User("lisi","654321"));
	 users.add(new User("itxuexi","itxuexi"));
	 users.add(new User("emmmmm","123456"));
	 users.add(new User("wangwu","567890"));
 }
 public  static List<User> getUsers(){
	 return users; 
 }
}

/*模拟用户登录*/
public class ClientTest {
public static void main(String[] args) throws UnknownHostException, IOException {
	//创建客户端套接字
	Socket s=new Socket("LAPTOP-ICK2OD8O", 8888);
	//获取用户名和密码
	BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
	System.out.println("请输入用户名:");
	String user=br.readLine();
	System.out.println("请输入密码:");
	String pass=br.readLine();
	//获取输出流对象
	PrintWriter pw =new PrintWriter(s.getOutputStream(),true);
	//写出数据
	pw.println(user);
	pw.println(pass);
	//获取输入流对象
	BufferedReader serbr=new BufferedReader(new InputStreamReader(s.getInputStream()));
  //获取服务器返回的数据
	String resu=serbr.readLine();
	System.out.println(resu);
  //释放资源
	s.close();
}
}

服务器端

ublic class ServerTest {
public static void main(String[] args) throws IOException {
	ServerSocket ss=new ServerSocket(8888);
//	监听
	Socket s=ss.accept();
//	获取输入流对象
	BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
	String user=br.readLine();
	String pass=br.readLine();
	boolean flag=false;
	//if(user.equals("itxuexi")&&pass.equals("123456")) {
	//	flag=true;
	//}
	List<User>users=UserDB.getUsers();
	User su=new User(user, pass);
	if(users.contains(su)) {
		flag=true;
	}
	//获取输入流对象
	PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
	if(flag) {
		pw.println("登录成功");
	}else {
		pw.println("登录失败");
	}
	//释放资源
	s.close();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值