网络编程
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();
}
}