java网络编程
java中有关网络方面的功能定义都在java.net包中
InetAddress类封装IP或域名
包含的方法:
* 获取本机对应的InetAdress对象:getLocalHost
* 根据主机获得对应的InetAdress对象,参数为String类型,可以是ip地址或域名:getByName(String )
* 根据主机获得具有相同名字的一组InetAddress对象:getAllByName(String)
* 获取addr所封装的IP地址对应的InetAddress对象:getByAddress(byte[] addr)
* 获取ip地址:getHostAddress
* 获取域名:getHostName
* 判断是否可以到达该地址:isReachable
URL类(Uniform Resource Locator,统一资源定位器)
通常语法格式: 协议名://主机名:端口号/资源名
getXXX()返回相应信息
URI类 统一资源标识符
唯一作用就是解析 可以将URL理解成URI的特例
创建URL对象需要抛出异常
openConnection方法用于返回一个URLConnection对象,URLConnection类提供一些更强的方法
• 获得文件的长度,类型,创建时间,修改时间 getXXX()
• 获得输入流,以便读取文件的数据 getInputStream()
• 获得输出流,以便输出数据 getOutputStream()
• 设置请求属性值:setRequestProperty(String key,String value)
基于TCP的网络编程 关于套接字 socket
使用TCP/IP协议进行通信时,会在通信的两端各建立一个Socket(套接字),从而形成虚拟链路
使用Socket对象封装了两端的通信端口,屏蔽了底层细节,其允许用户将网络连接当成一个IO流,
读写数据
主要使用java.net包下的两个类:
ServeSocket类:服务器套接字
Socket类:客户端套接字
都必须抛出异常
基础用法:
客户端:
1 |
|
服务端
1 |
|
应用:实现一个简易的聊天室
客户端:
package 网络编程;
import java.awt.BorderLayout;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class chatClient extends JFrame {
Socket socket = null;
PrintStream pStream = null;
BufferedReader bReader = null;
JPanel jPanelbottom = null;
JScrollPane jScrollPane = null;
JLabel label_name = null;
JLabel label_txt = null;
JButton send = null;
JTextArea maintxt = null;
JTextField txt_name = null;
JTextField txt_input = null;
public chatClient() {
// TODO Auto-generated constructor stub
// 组装底部一栏
super("聊天室");
label_name = new JLabel("昵称");
txt_name = new JTextField(5);
label_txt = new JLabel("输入消息");
txt_input = new JTextField(20);
send = new JButton("发送");
jPanelbottom = new JPanel();
jPanelbottom.add(label_name);
jPanelbottom.add(txt_name);
jPanelbottom.add(label_txt);
jPanelbottom.add(txt_input);
jPanelbottom.add(send);
this.add(jPanelbottom, BorderLayout.SOUTH);
// 组装显示主界面
maintxt = new JTextArea();
maintxt.setEditable(false);
jScrollPane = new JScrollPane(maintxt);
this.add(jScrollPane);
this.setSize(500, 300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
// 创建socket对象
socket = new Socket("10.0.218.101", 28888);
// 创建一个往socket里写数据的管道
pStream = new PrintStream(socket.getOutputStream());
// 创建一个从socket里读数据的管道
bReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (Exception e) {
e.printStackTrace();// TODO: handle exception
}
// 为发送按钮注册监听
send.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
String name = txt_name.getText();
String msg = txt_input.getText();
if (!msg.equals("")) {
pStream.println(name + "说:" + msg);
pStream.flush();
// 发送完毕清空输入框
txt_input.setText("");
}
}
});
// 启动线程
new GetMsg().start();
}
// 接收服务器返回信息的线程
class GetMsg extends Thread {
public void run() {
while (this.isAlive()) {
try {
String getMsg = bReader.readLine();
if (getMsg != null) {
// 主窗口显示信息并换行
maintxt.append(getMsg + "\n");
}
Thread.sleep(50);
} catch (Exception e) {
e.printStackTrace();// TODO: handle exception
}
}
}
}
public static void main(String[] args) {
new chatClient().setVisible(true);
}
}
服务端:
package 网络编程;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import javax.swing.JFrame;
public class chatServer extends JFrame {
// 声明服务器端套接字
ServerSocket serverSocket;
// 输入流列表集合
ArrayList<BufferedReader> bReaders = new ArrayList<BufferedReader>();
// 输出流列表集合
ArrayList<PrintWriter> pStreams = new ArrayList<PrintWriter>();
// 聊天信息链表集合
LinkedList<String> msgList = new LinkedList<String>();
public chatServer() {
try {
serverSocket = new ServerSocket(28888);
} catch (Exception e) {
e.printStackTrace();// TODO: handle exception
}
// 创建接收客户端Socket的线程实例,并启动
new getMsg().start();
// 创建给客户端发送消息的线程实例,并启动
new SendMag().start();
System.out.println("服务器已经启动");
}
// 接收客户端消息线程
class getMsg extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
while (this.isAlive()) {
try {
// 接收一个客户端socket对象
Socket socket = serverSocket.accept();
if (socket != null) {
// 获取socket对象的输入流
BufferedReader bReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 将输入流添加入输入流列表集合中
bReaders.add(bReader);
// 开启一个线程接收该客户的聊天信息
new getMsg1(bReader).start();
// 获取socket对象的输出流,并将其加入输出流列表中
pStreams.add(new PrintWriter(socket.getOutputStream()));
}
} catch (Exception e) {
e.printStackTrace();// TODO: handle exception
}
}
}
}
// 接收客户聊天信息的线程
class getMsg1 extends Thread {
BufferedReader bReader;
public getMsg1(BufferedReader bReader) {
this.bReader = bReader;
}
@Override
public void run() {
while (this.isAlive()) {
try {
// 从输入流中读取一行消息
String strMsg = bReader.readLine();
if (strMsg != null) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String strTime = dateFormat.format(new Date());
msgList.addFirst("<== " + strTime + " ==>\n" + strMsg);
}
} catch (Exception e) {
e.printStackTrace();// TODO: handle exception
}
}
}
}
// 给所有客户发送聊天信息的线程
class SendMag extends Thread {
@Override
public void run() {
while (this.isAlive()) {
try {
// 如果信息链表不为空 发送
if (!msgList.isEmpty()) {
String msg = msgList.removeLast();
for (int i = 0; i < pStreams.size(); i++) {
pStreams.get(i).println(msg);
pStreams.get(i).flush();
}
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
}
public static void main(String[] args) {
new chatServer();
}
}
java网络编程
https://shanhainanhua.github.io/2019/09/03/java网络编程/