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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package 网络编程;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
try {
//创建连接到本机对象
Socket socket=new Socket("10.0.218.101",28888);
//将socket对应的输出对象包装成printstream
PrintStream printStream=new PrintStream(socket.getOutputStream());
//往服务器发送信息
printStream.println("我是客户");
printStream.flush();
//获取服务器的信息,将socket对应的输入流包装成bufferreader
//BufferedInputStream bufferedInputStream=new BufferedInputStream(socket.getInputStream());
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line=bufferedReader.readLine();
System.out.println("来自服务器的数据:"+line);
//关闭
bufferedReader.close();
printStream.close();
socket.close();
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}

服务端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package 网络编程;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server extends Thread {
ServerSocket server;
// 计数
int num = 0;

public Server() {
// 创建serversocket,用于监听客户端对应的端口号是否有socket
try {
server = new ServerSocket(28888);
} catch (Exception e) {
e.printStackTrace();
}
// 启动当前线程,执行run方法
this.start();
System.out.println("服务器启动");

}

public void run() {
while (this.isAlive()) {
try {
// 首先接受客户端的Socket
Socket socket = server.accept();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 读客户端发送的消息并显示
String line = bufferedReader.readLine();
System.out.println("客户端发送的消息为:" + line);
// 将socket对应的输出流包装成为printstream
PrintStream printStream = new PrintStream(socket.getOutputStream());
// 往客户端发送消息
printStream.println("您是第" + (++num) + "个访问服务器的用户!");
printStream.close();
bufferedReader.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();// TODO: handle exception
}
}
}
public static void main(String[] args) {
new Server();
}

}

应用:实现一个简易的聊天室

客户端:
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网络编程/
作者
wantong
发布于
2019年9月3日
许可协议