Java语法回顾之网络编程
读了那么多年的书让我明白一个道理。人要稳重,不要想到啥就做啥。做一行越久即使你不会,几年之后慢慢的你也会了,加上一点努力你或许你能成为别人眼中的专家。
InetAddress类的学习
/**
* InetAddress:表示IP地址。
*
* 没有构造方法,想到那些问题呢?
* A:成员都是静态的。
* B:肯定有静态方法返回该类的对象。
*
* 通过查看API,我们找到了一个有意义的:
* public static InetAddress getByName(String host)
*
* 成员方法:
* IP地址:public String getHostAddress()
* 主机名:public String getHostName()
*/
public class MyInetAddress {
public static void main(String[] args){
InetAddress localHost = null;
try {
//通过getLocalHost()获取InetAddress对象
localHost = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
e.printStackTrace();
}
String hostAddress = localHost.getHostAddress();
String hostName = localHost.getHostName();
System.out.println("本机IP地址:"+hostAddress+"本机名称:"+hostName);
}
}
DatagramSocket类的学习
/**
* UDP协议发送数据步骤:
* A:创建发送端Socket服务对象
* B:创建数据,并把数据打包
* C:发送数据
* D:释放资源
*/
/**
* UDP协议接收数据步骤:
* A:创建接收端Socket服务对象
* B:创建数据包(接收容器)
* C:调用接收方法
* D:解析数据包,把数据显示在控制台
* E:释放资源
* <p/>
* 注意:
* A:端口一定要一致。
* B:Exception in thread "main" java.net.BindException:
* Address already in use: Cannot bind
*/
DatagramSocket类的学习代码测试
//发送端
public class SendDemo {
public static void main(String[] args) throws IOException {
// 创建发送端Socket服务对象
DatagramSocket ds = new DatagramSocket();
// 创建数据,并把数据打包
String str = "hello,udp,我来了";
// public DatagramPacket(byte[] buf,int length,InetAddress address,int
// port)
byte[] bys = str.getBytes();
int length = bys.length;
InetAddress address = InetAddress.getByName("192.168.3.172");
int port = 12306;
DatagramPacket dp = new DatagramPacket(bys, length, address, port);
// 发送数据
// public void send(DatagramPacket p)
ds.send(dp);
// 释放资源
ds.close();
}
}
//接收端
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
// 创建接收端Socket服务对象
// DatagramSocket(int port)
DatagramSocket ds = new DatagramSocket(12306);
// 创建数据包(接收容器)
// public DatagramPacket(byte[] buf,int length)
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
// 调用接收方法
// public void receive(DatagramPacket p)
ds.receive(dp);
// 解析数据包,把数据显示在控制台
// public InetAddress getAddress()
InetAddress address = dp.getAddress();
String ip = address.getHostAddress();
// public byte[] getData()
byte[] bys2 = dp.getData();
// public int getLength()
int length = dp.getLength();
String s = new String(bys2, 0, length);
System.out.println(ip + "***" + s);
// 释放资源
ds.close();
}
}
发送数据,来自于键盘录入
/**
* 需求:发送数据,来自于键盘录入。
* 发送端
*/
public class MySend {
public static void main(String[] args) throws IOException {
//创建socket对象
DatagramSocket ds = new DatagramSocket();
//创建数据包,来源键盘录入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while ((line = br.readLine()) != null) {
if ("886".equals(line)) {
break;
}
byte[] bytes = line.getBytes();
int length = bytes.length;
//发送数据
DatagramPacket dp = new DatagramPacket(bytes, length, InetAddress.getByName("192.168.1.100"), 12306);
ds.send(dp);
}
ds.close();
}
}
/**
* 接收端
*/
public class MyReceive {
public static void main(String[] args) throws IOException {
//创建socket对象,端口必须一致
DatagramSocket ds = new DatagramSocket(12306);
while(true){
byte[] bytes = new byte[1024];
int length = bytes.length;
//创建数据包
DatagramPacket dp = new DatagramPacket(bytes,length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
String str = new String(dp.getData(),0,dp.getLength());
// if ("886".equals(str)){
// System.out.println("886");
// System.exit(10);
// }
System.out.println(str+ip+"哈哈哈");
}
}
}
基于TCP的socket通信演示
/**
* 基于TCP的Server端
* 1.创建socket对象
* 2.建立连接
* 3.获取输入流数据,并显示控制台
* 4.释放资源
*/
public class MyServer {
public static void main(String[] args) throws IOException {
//创建ServerSocket
ServerSocket ss = new ServerSocket(12306);
//监听连接
Socket s = ss.accept();
//通过监听连接,获取socket对象,通过socket对象获取输入流
InputStream is = s.getInputStream();
//通过输入流,读取数据并显示
byte[] bys = new byte[1024];
int len = is.read(bys);
String str = new String(bys, 0, len);
System.out.println(str);
//释放资源
s.close();
//不要关闭ServerSocket资源,用于监听其他连接
// ss.close();
}
}
/**
* 基于TCP通信协议的聊天客户端
*
* 1.创建socket对象,并选择ip和端口
* 2.建立连接
* 3.创建输入流,写入数据
* 4.释放资源
*/
public class MyClient {
public static void main(String[] args) throws IOException {
Socket s = new Socket("192.168.1.30",12306);
//获取输入流,写入数据
OutputStream os = s.getOutputStream();
//写入数据
byte[] bytes = "哈哈,我来咯".getBytes();
os.write(bytes,0,bytes.length);
//关闭资源
s.close();
}
}
TCP协议的socket综合练习
/*
* 需求:客户端发送消息,服务器用文本接受,当消息接受完成,给客户端反馈一条消息。
* 写数据,数据进去了,但是反馈没有成功。
* 原因:就是因为服务器不知道你已经写完了。
*
* 怎么解决?告诉服务器我写完了。
* 怎么告诉:
* A:自定义接收标记 假如有一个数据叫886,就出事了。
* B:Socket提供了一个方法,来通知我接收了。
* public void shutdownOutput()
*/
public class MyServer {
public static void main(String[] args) throws IOException {
//创建ServerSocket对象
ServerSocket ss = new ServerSocket(12306);
//监听连接
Socket s = ss.accept();
//把接受的字符存入文本文件,首先创建文件,因为是每次接受一行用BufferedWriter
BufferedWriter bw = new BufferedWriter(new FileWriter("Server.txt",true));
//通过socket对象获取输出流,并用BufferedReader封装每次读一行数据
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String line = null;
while((line = br.readLine())!= null){
bw.write(line);
bw.newLine();
bw.flush();
}
if(line == null){
//如果line等于null,就给client反馈一条信息
BufferedWriter bw2 = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
bw2.write("服务器数据接受完成");
bw2.flush();
// bw2.close();
System.out.println("我就打印一句话");
}
s.close();
}
}
public class MyClient {
public static void main(String[] args) throws IOException {
//创建socket对象
Socket s = new Socket("192.168.1.102",12306);
//封装键盘录入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//获取输出流对象
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line = null;
while((line = br.readLine())!=null){
if("over".equals(line)){
break;
}
bw.write(line);
bw.newLine();
bw.flush();
}
//消息录入完毕的标记
s.shutdownOutput();
//从服务器获取到反馈信息
BufferedReader br2 = new BufferedReader(new InputStreamReader(s.getInputStream()));
System.out.println(br2.readLine()+"O(∩_∩)O哈哈~");
// br2.close();
br.close();
s.close();
}
}