一、UDP之发送和接收数据案例
发送端
package com.bianyiit.cast;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class SendDataGramSocketDemo {
public static void main(String[] args) throws IOException {
//创建发送端链接对象
DatagramSocket ds = new DatagramSocket();
String s1="IDEA";
byte[] arr = s1.getBytes();
//打包
DatagramPacket dp = new DatagramPacket(arr, arr.length, InetAddress.getLocalHost(), 9999);
ds.send(dp);
//释放资源
ds.close();
}
}
接收端
package com.bianyiit.cast;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ReceiveDataGramSocketDemo {
public static void main(String[] args) throws IOException {
//接收端
DatagramSocket ds = new DatagramSocket(9999);
//接收数据
byte[] arr=new byte[1024];
DatagramPacket dp = new DatagramPacket(arr,arr.length);
ds.receive(dp);
//数据包的长度1024
byte[] data = dp.getData();
//在这里截取实际字符串长度的信息,并非1024个字节,而是4个字节
String s = new String(data,0,dp.getLength());
System.out.println(s);
ds.close();
/* //数据本身的长度4
int length = dp.getLength();
System.out.println(length);*/
}
}
注意
1.如果以下面的方式输出结果,除了已有的数据还会要很多空格,因为这里打印的是1024个字节长度的数据,而实际数据只有4个字节
byte[] data = dp.getData();
//在这里截取实际字符串长度的信息,并非1024个字节,而是4个字节
String s = new String(data);
System.out.println(s);
2.必须在将字节数组转换成字符串的数据的时候使用String另一个构造方法,只截取发送的内容4个字节,并非1024个字节
byte[] data = dp.getData();
String s = new String(data,0,dp.getLength());
String s = new String(data);
System.out.println(s);
二、UDP模拟登陆案例
发送端模拟登陆,如果成功,返回“登陆成功”;如果失败,返回“登陆失败”
package com.bianyiit.udplogin;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class SendDemo {
public static void main(String[] args) throws IOException {
//发送端输入用户名和密码(键盘录入)发送到接收端 最终以"用户名=密码"格式发送
//接收端接收用户和密码,跟已有的用户名"张三"和密码"1234"进行比较
//如果用户名和密码都一致,往发送端进行显示提示"登陆成功",否则显示登陆失败
Scanner sc=new Scanner(System.in);
System.out.print("请输入用户名:");
String username = sc.next();
System.out.print("请输入密码:");
String password = sc.next();
String s=username+"="+password;
//创建发送端连接对象
DatagramSocket ds = new DatagramSocket();
//打包
DatagramPacket dp = new DatagramPacket(s.getBytes(), s.getBytes().length, InetAddress.getLocalHost(), 9999);
ds.send(dp);
//System.out.println("发送成功...");
ds.close();
//创建接收端对象
DatagramSocket ds1 = new DatagramSocket(9998);
//接收数据
byte[] arr1=new byte[1024];
DatagramPacket dp1 = new DatagramPacket(arr1, arr1.length);
ds1.receive(dp1);
byte[] data = dp1.getData();
String s1 = new String(data, 0, dp1.getLength());
System.out.println(s1);
ds1.close();
}
}
接收端
package com.bianyiit.udplogin;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
//创建接收端对象
DatagramSocket ds = new DatagramSocket(9999);
//接收数据包
byte[] arr=new byte[1024];
DatagramPacket dp = new DatagramPacket(arr, arr.length);
ds.receive(dp);
//System.out.println("接收成功...");
byte[] data = dp.getData();
String s = new String(data, 0, dp.getLength());
System.out.println(s);
ds.close();
//验证发送端发来的用户名和密码是否正确
String[] login = s.split("=");
String username = login[0];
String password = login[1];
//创建发送端对象
DatagramSocket ds1 = new DatagramSocket();
if(username.equals("张三")&&password.equals("1234")){
//System.out.println("登陆成功");
String ret="登陆成功";
//发送数据包
DatagramPacket dp1 = new DatagramPacket(ret.getBytes(), ret.getBytes().length, InetAddress.getLocalHost(), 9998);
ds1.send(dp1);
}else{
String ret="登陆失败";
//发送数据包
DatagramPacket dp1 = new DatagramPacket(ret.getBytes(), ret.getBytes().length, InetAddress.getLocalHost(), 9998);
ds1.send(dp1);
}
ds1.close();
}
}
三、TCP模拟聊天室案例
客户端
package com.bianyiit.TCPChat;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class ClientDemo {
public static void main(String[] args) throws IOException {
//聊天室案例
Scanner sc=new Scanner(System.in);
//服务器端
//必须将服务器的端口号放在循环外面,因为while里面没有关闭连接对象,会一直占用端口号
ServerSocket serverSocket = new ServerSocket(9998);
while (true) {
//创建客户端连接对象
Socket server = new Socket("127.0.0.1", 9999);
//创建输出流对象
OutputStream os = server.getOutputStream();
PrintWriter pw = new PrintWriter(os);
System.out.print("路人甲说:");
String s1 = sc.next();
pw.write(s1);
pw.close();
//进入监听状态
Socket accept = serverSocket.accept();
//通过监听对象获取输入流对象
InputStream is = accept.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String s2 = br.readLine();
System.out.println("对方说:"+s2);
br.close();
}
}
}
服务器
package com.bianyiit.TCPChat;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class ServerDemo {
public static void main(String[] args) throws IOException {
Scanner sc=new Scanner(System.in);
//服务器端
//必须将服务器的端口号放在循环外面,因为while里面没有关闭连接对象,会一直占用端口号
ServerSocket serverSocket = new ServerSocket(9999);
while(true){
//进入监听状态
Socket accept = serverSocket.accept();
//通过监听对象获取输入流对象
InputStream is = accept.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String s1 = br.readLine();
System.out.println("对方说:"+s1);
br.close();
//创建客户端连接对象
Socket server = new Socket("127.0.0.1", 9998);
//创建输出流对象
OutputStream os = server.getOutputStream();
PrintWriter pw = new PrintWriter(os);
System.out.print("路人乙说:");
String s2 = sc.next();
pw.write(s2);
pw.close();
}
}
}
四、TCP模拟登陆案例
客户端
package com.bianyiit.tcplogin;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class ClientDemo {
public static void main(String[] args) throws IOException {
Scanner sc=new Scanner(System.in);
System.out.print("请输入用户名:");
String username = sc.next();
System.out.print("请输入密码:");
String password = sc.next();
String s=username+"="+password;
//创建客户端连接对象
Socket socket = new Socket("127.0.0.1",9999);
//创建流对象
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.write(s);
pw.close();
socket.close();
//创建服务端对象接收数据
ServerSocket serverSocket = new ServerSocket(9998);
//进入监听状态
Socket accept = serverSocket.accept();
InputStream is = accept.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String s1 = br.readLine();
System.out.println(s1);
br.close();
serverSocket.close();
}
}
服务器
package com.bianyiit.tcplogin;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {
public static void main(String[] args) throws IOException {
//创建服务端对象
ServerSocket serverSocket = new ServerSocket(9999);
//进入监听状态
Socket accept = serverSocket.accept();
InputStream is = accept.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String s = br.readLine();
System.out.println(s);
//验证发送端发来的用户名和密码是否正确
String[] login = s.split("=");
String username = login[0];
String password = login[1];
//创建客户端对象发送登陆返回是否成功的消息
Socket socket = new Socket("127.0.0.1",9998);
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
if(username.equals("张三")&&password.equals("1234")) {
String s1="登陆成功!!";
pw.write(s1);
}else{
String s1="登陆失败!!";
pw.write(s1);
}
pw.close();
socket.close();
}
}
五、使用UDP发送数据,使用TCP接收数据案例
发送端/服务器
package com.bianyiit.tcpAndudplogin;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.*;
import java.util.Scanner;
public class SendAndClient {
public static void main(String[] args) throws IOException {
Scanner sc=new Scanner(System.in);
System.out.print("请输入用户名:");
String username = sc.next();
System.out.print("请输入密码:");
String password = sc.next();
String s=username+"="+password;
//创建发送端连接对象
DatagramSocket ds = new DatagramSocket();
//打包
DatagramPacket dp = new DatagramPacket(s.getBytes(), s.getBytes().length, InetAddress.getLocalHost(), 9999);
ds.send(dp);
//System.out.println("发送成功...");
ds.close();
//创建服务端对象接收数据
ServerSocket serverSocket = new ServerSocket(9998);
//进入监听状态
Socket accept = serverSocket.accept();
InputStream is = accept.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String s1 = br.readLine();
System.out.println(s1);
br.close();
serverSocket.close();
}
}
接收端/客户端
package com.bianyiit.tcpAndudplogin;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Socket;
public class ReceiveAndServer {
public static void main(String[] args) throws IOException {
//创建接收端对象
DatagramSocket ds = new DatagramSocket(9999);
//接收数据包
byte[] arr=new byte[1024];
DatagramPacket dp = new DatagramPacket(arr, arr.length);
ds.receive(dp);
//System.out.println("接收成功...");
byte[] data = dp.getData();
String s = new String(data, 0, dp.getLength());
System.out.println(s);
ds.close();
//验证发送端发来的用户名和密码是否正确
String[] login = s.split("=");
String username = login[0];
String password = login[1];
//创建客户端对象发送登陆返回是否成功的消息
Socket socket = new Socket("127.0.0.1",9998);
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
if(username.equals("张三")&&password.equals("1234")) {
String s1="登陆成功!!";
pw.write(s1);
}else{
String s1="登陆失败!!";
pw.write(s1);
}
pw.close();
socket.close();
}
}
六、使用线程和TCP模拟服务器一对多聊天室
服务器
package com.bianyiit.xianchengTCP;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class ServerDemo {
public static void main(String[] args) {
Thread1 thread1 = new Thread1();
Thread2 thread2 = new Thread2();
Thread t1=new Thread(thread1);
Thread t2=new Thread(thread2);
t1.start();
t2.start();
}
}
class Thread1 implements Runnable{
@Override
public void run() {
Scanner sc=new Scanner(System.in);
//服务器端
//必须将服务器的端口号放在循环外面,因为while里面没有关闭连接对象,会一直占用端口号
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(9999);
} catch (IOException e) {
e.printStackTrace();
}
while(true){
try {
//进入监听状态
Socket accept = serverSocket.accept();
//通过监听对象获取输入流对象
InputStream is = accept.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String s1 = br.readLine();
System.out.println("客户端1说:"+s1);
//System.out.println();
br.close();
//创建客户端连接对象
Socket server = new Socket("127.0.0.1", 9997);
//创建输出流对象
OutputStream os = server.getOutputStream();
PrintWriter pw = new PrintWriter(os);
System.out.print("服务器说:");
String s2 = sc.next();
pw.write(s2);
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
class Thread2 implements Runnable{
@Override
public void run() {
Scanner sc=new Scanner(System.in);
//服务器端
//必须将服务器的端口号放在循环外面,因为while里面没有关闭连接对象,会一直占用端口号
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(9998);
} catch (IOException e) {
e.printStackTrace();
}
while(true){
try {
//进入监听状态
Socket accept = serverSocket.accept();
//通过监听对象获取输入流对象
InputStream is = accept.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String s1 = br.readLine();
System.out.println("客户端2说:"+s1);
//System.out.println();
br.close();
//创建客户端连接对象
Socket server = new Socket("127.0.0.1", 9996);
//创建输出流对象
OutputStream os = server.getOutputStream();
PrintWriter pw = new PrintWriter(os);
System.out.print("服务器说:");
String s2 = sc.next();
pw.write(s2);
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端1
package com.bianyiit.xianchengTCP;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class ClientDemo1 {
public static void main(String[] args) throws IOException {
//聊天室案例
Scanner sc=new Scanner(System.in);
//服务器端
//必须将服务器的端口号放在循环外面,因为while里面没有关闭连接对象,会一直占用端口号
ServerSocket serverSocket = new ServerSocket(9997);
while (true) {
//创建客户端连接对象
Socket server = new Socket("127.0.0.1", 9999);
//创建输出流对象
OutputStream os = server.getOutputStream();
PrintWriter pw = new PrintWriter(os);
System.out.print("客户端1说:");
String s1 = sc.next();
pw.write(s1);
pw.close();
//进入监听状态
Socket accept = serverSocket.accept();
//通过监听对象获取输入流对象
InputStream is = accept.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String s2 = br.readLine();
System.out.println("服务器说:"+s2);
br.close();
}
}
}
客户端2
package com.bianyiit.xianchengTCP;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class ClientDemo2 {
public static void main(String[] args) throws IOException {
//聊天室案例
Scanner sc=new Scanner(System.in);
//服务器端
//必须将服务器的端口号放在循环外面,因为while里面没有关闭连接对象,会一直占用端口号
ServerSocket serverSocket = new ServerSocket(9996);
while (true) {
//创建客户端连接对象
Socket server = new Socket("127.0.0.1", 9998);
//创建输出流对象
OutputStream os = server.getOutputStream();
PrintWriter pw = new PrintWriter(os);
System.out.print("客户端2说:");
String s1 = sc.next();
pw.write(s1);
pw.close();
//进入监听状态
Socket accept = serverSocket.accept();
//通过监听对象获取输入流对象
InputStream is = accept.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String s2 = br.readLine();
System.out.println("服务器说:"+s2);
br.close();
}
}
}
七、通过URL类获取连接对象,并返回对应的网页显示在控制台
package com.bianyiit.cast;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
public class URLDemo4 {
public static void main(String[] args) throws IOException {
//URL---代表的就是一个网址
String str_url="http://www.bianyiit.com:80";
URL url = new URL(str_url);
/*String getProtocol()---获取此 URL 的协议名称。*/
System.out.println("getProtocol:"+url.getProtocol());
/*String getHost()---获取此 URL 的主机名(如果适用)。 */
System.out.println("getHost:"+url.getHost());
/*int getPort()---获取此 URL 的端口号。 */
System.out.println("getPort:"+url.getPort());
/*String getFile()---获取此 URL 的文件名。 */
System.out.println("getFile:"+url.getFile());
/*String getPath()---获取此 URL 的路径部分。 */
System.out.println("getPath:"+url.getPath());
/*String getQuery()---获取此 URL 的查询部分 */
System.out.println("getQuery:"+url.getQuery());
/* InputStream openStream()---打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。 */
InputStream in = url.openStream();
//获取url对象的Url连接器对象。将连接封装成了对象:java中内置的可以解析的具体协议的对象+socket.
/*URLConnection openConnection()---返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。 */
/*URLConnection conn = url.openConnection();
System.out.println(conn);
*//*String getHeaderField(String name)---返回指定的头字段的值。 *//*
String value = conn.getHeaderField("Content-Type");
System.out.println(value);
InputStream in = conn.getInputStream();*/
byte[] bytes = new byte[10240];
int len = in.read(bytes);
String text = new String(bytes,0,len);
System.out.println(text);
in.close();
}
}
//输出结果:
getProtocol:http
getHost:www.bianyiit.com
getPort:80
getFile:
getPath:
getQuery:null
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<!-- 启用极速模式(webkit) -->
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
...