Java网络编程复习

Java网络编程复习,第1张

文章目录
  • 1、网络编程要解决的问题
  • 2、Java网络编程
    • 1、TCP网络编程
    • 2、UDP网络编程
    • 3、URL网络编程
  • 3、网络编程的阻塞问题

1、网络编程要解决的问题
  1. 如何定位到其他计算机
  2. 如何稳定的进行传输数据

对此提出了三个概念,其中IP与端口组成了套接字(Socket),用于区分计算机上的服务

  • IP地址
  • 端口
  • 通信协议

计算机网络的内容就不在这普及了

2、Java网络编程
  • TCP网络编程
  • UDP网络编程
  • URL网络编程
1、TCP网络编程
  • Socket类:表示要通信的对象
  • InetAddress类:表示IP地址
  • ServerSocket类:表示服务端

Socket

构造方法
//创建一个流套接字并将其连接到指定主机上的指定端口号。
1	public Socket(String host, int port) throws UnknownHostException, IOException.
//创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
2	public Socket(InetAddress host, int port) throws IOException
//创建一个套接字并将其连接到指定远程主机上的指定远程端口
3	public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException.
//创建一个套接字并将其连接到指定远程地址上的指定远程端口
4	public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException.
//通过系统默认类型的 SocketImpl 创建未连接套接字
5	public Socket()
=================================================================
常用方法
//将此套接字连接到服务器,并指定一个超时值。
1	public void connect(SocketAddress host, int timeout) throws IOException
//返回套接字连接的地址。
2	public InetAddress getInetAddress()
//返回此套接字连接到的远程端口。
3	public int getPort()
//返回此套接字绑定到的本地端口。
4	public int getLocalPort()
//返回此套接字连接的端点的地址,如果未连接则返回 null。
5	public SocketAddress getRemoteSocketAddress()
//返回此套接字的输入流。
6	public InputStream getInputStream() throws IOException
//返回此套接字的输出流。
7	public OutputStream getOutputStream() throws IOException
//关闭此套接字。
8	public void close() throws IOException

ServerSocket

//创建绑定到特定端口的服务器套接字。
public ServerSocket(int port) throws IOException
//侦听并接受到此套接字的连接。
public Socket accept() throws IOException

应用

  @Test
    public void client() throws IOException {
        PrintWriter writer = null;
        Socket socket = null;

        try {
            InetAddress address = InetAddress.getByName("127.0.0.1");
            socket = new Socket(address,6666);
            OutputStream outputStream = socket.getOutputStream();
            writer = new PrintWriter(outputStream);
            writer.print("hello world");

        } catch (IOException e) {
            e.printStackTrace();
        } finally {

            try {
                if (writer != null)
                writer.close();
            } catch (Exception e) {
                e.printStackTrace();
            }

            try {
                if (socket != null)
                    socket.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    @Test
    public void server() throws IOException {
        Socket accept = null;
        InputStream inputStream = null;
        ServerSocket socket = null;
        try {
             socket = new ServerSocket(6666);
             accept = socket.accept();
             inputStream = accept.getInputStream();
            byte[] bytes = new byte[1024];
            int len;
            while ((len = inputStream.read(bytes)) != -1){
                System.out.println(new String(bytes,0,len));
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (inputStream != null)
                    inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (socket != null)
                    socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (accept != null)
                    accept.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
2、UDP网络编程

应用

public class Server {
    public static void main(String[] args) {
        try {
            DatagramSocket server = new DatagramSocket(5060);
            DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
            server.receive(packet);
            System.out.println(packet.getAddress().getHostName() + "(" + packet.getPort() + "):" + new String(packet.getData()));
            packet.setData("Hello Client".getBytes());
            packet.setPort(5070);
            packet.setAddress(InetAddress.getLocalHost());
            server.send(packet);
            server.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
===================================================================
public class Client {
    public static void main(String[] args){
        try {
            DatagramSocket client = new DatagramSocket(5070);
            DatagramPacket packet = new DatagramPacket(new byte[1024],1024);
            packet.setPort(5060);
            packet.setAddress(InetAddress.getLocalHost());
            packet.setData("Hello Server".getBytes());
            client.send(packet);
            client.receive(packet);
            System.out.println(packet.getAddress().getHostName() + "(" + packet.getPort() + "):" + new String(packet.getData()));
            client.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
3、URL网络编程

URL网络编程

3、网络编程的阻塞问题

我的客户端发送一个时间给服务端,然后服务端接收这个数据并给客户端返回一个数据,然后客户端接收这个数据并输出。

我在实现这个功能的时候,发现客户端和服务端启动后都被阻塞住了,原因是当客户端给服务端发送完数据的时候服务端在读取数据,但是服务端没有办法判断什么时候会自动中断,所以他会在这个地方阻塞。阻塞之后服务端就没有办法往客户端发送数据,这个时候客户端的接收数据也会等服务端的数据,会在这里阻塞。这个时候服务端和客户端都不会关闭,会一直持续阻塞。

造成这个问题一共有两个原因,

第一传递数据的时候,另一端不知道什么时候终止,用read!=-1是没有办法判断出来的,因为流没有终止,流一直存在,所以另一端以为数据没有传输完毕。

第二,如果数据量不够大的话,就会造成数据被写入内存,而没有被传输过去,只是被放到了内存。

解决这两个问题,第一个问题就是,在传输结束之后,你可以把流进行关闭,使用socket.shutdownOutput()和socket.shutdownInput()这两个方法,将流关闭掉,对面就可以接收到结束的信号。第二个在你传输的时候随时记得刷新一下flush()或者使用一些会自动刷新的写的方法如println();

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/795315.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存