网络编程

网络编程三要素:IP+端口+协议

IP 用来确定一台就算机的唯一性
端口 确定一个应用程序 范围是 0—65535 其中 0—1023 被系统占用
协议 通信规则

网络编程

网络编程也叫作Socket编程 Socket=IP+端口
Socket 编程要求两端都需要Socket 计算机A QQ 计算机B QQ
网络编程分为两部分:客户端和服务端

UDP编程

DatagramSocket

Java针对UDP通信协议,提供了UDP的Socket
DatagramSocket UDP通信的Socket

DatagramSocket( int port, InetAddress laddr) 创建数据报套接字,将其绑定到指定的本地地址。
DatagramPacket( byte[] buf, int length, InetAddress address,int port)
构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

取出发送者的IP
    InetAddress address = datagramPacket.getAddress();
    String ip = address.getHostAddress();
UDP客户端编程代码
public class UDPClient {
public static void main(String[] args) throws IOException {
    //UDP 客户端
    //1.创建客户端Socket
   // DatagramSocket( int port, InetAddress laddr) 创建数据报套接字,将其绑定到指定的本地地址。

    DatagramSocket socket = new DatagramSocket();

    //DatagramPacket( byte[] buf, int length, InetAddress address,int port)
    //构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
    //2.发送数据 DatagramPacket 数据报包
    byte[] bytes = "你好UDP".getBytes();
    DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("192.168.8.123"), 9898);
    socket.send(packet);

    //3.释放资源

    socket.close();
}
}
UDP服务端编程代码
public class UDPServer {
public static void main(String[] args) throws IOException {
    //创建服务端的套接字
    //DatagramSocket( int port)
    //创建数据报套接字并将其绑定到本地主机上的指定端口。
    DatagramSocket socket = new DatagramSocket(9898);
    //接收数据
    //DatagramPacket( byte[] buf, int length)
    //构造 DatagramPacket,用来接收长度为 length 的数据包。
    byte[] bytes = new byte[1024];
    DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
    System.out.println("服务器已经开启等待接收收据...");
    socket.receive(datagramPacket); //阻塞在这里,等待接收数据
    //取出数据报包中的数据
    byte[] data = datagramPacket.getData();
    //把数据转成字符串
    System.out.println(new String(data, 0, datagramPacket.getLength()));

    //释放资源
    socket.close();

}

}

TCP编程

TCP 需要两端建立连接
TCP 的客户端套接字 ,套接字是两台机器间通信的端点

Socket类

Socket 此类实现客户端套接字。
Socket(InetAddress address, int port)
创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
Socket(String host, int port)
创建一个流套接字并将其连接到指定主机上的指定端口号。

ServerSocket

ServerSocket 此类实现服务器套接字。服务器套接字等待请求通过网络传入。
ServerSocket( int port)
创建绑定到特定端口的服务器套接字。

TCP客户端编程代码
public class TCPClient {
public static void main(String[] args) throws IOException {
    //TCP 需要两端建立连接
    //TCP 的客户端套接字  Socket
    //  Socket  此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
    //  Socket(InetAddress address, int port)
    //  创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
    //
    //  Socket(String host, int port)
    //  创建一个流套接字并将其连接到指定主机上的指定端口号。
    //参数1 服务器的IP 服务器的端口
    Socket socket = new Socket("192.168.8.123", 7777);
    //获取通道中的流,使用流就可以读写数据
    OutputStream out = socket.getOutputStream();
    //写出数据
    out.write("你好TCP".getBytes());

    //关闭客户端
    out.close();



}
}
UDP服务端编程代码
public class TCPServer {
public static void main(String[] args) throws IOException {
    //TCP 服务端的套接字  ServerSocket 此类实现服务器套接字。服务器套接字等待请求通过网络传入。
    //ServerSocket( int port)
    //创建绑定到特定端口的服务器套接字。
    ServerSocket ss = new ServerSocket(7777);
    //监听客户端
    //侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。
    System.out.println("服务器已经开启...");
    Socket sk = ss.accept();//阻塞式方法,等待客户端的连接 侦听并接受到此套接字的连接。
    //获取通道中的输入流
    InputStream inputStream = sk.getInputStream();
    byte[] bytes = new byte[1024];
    int len = inputStream.read(bytes);
    System.out.println(new String(bytes,0,len));
    //释放资源
    ss.close();
}
}

TCP上传文本文件并给出反馈程序

客户端
public class TCPClient {
public static void main(String[] args) throws IOException{
    Socket socket = new Socket("192.168.8.123", 9999);
    //获取通道中的输出流
    OutputStream out = socket.getOutputStream();
    //包装通道中的输出流
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out));
    //创建一个输入流,来关联这个文本文件
    BufferedReader reader = new BufferedReader(new FileReader("msg.txt"));
    String line = null;
    while ((line = reader.readLine()) != null) {
        writer.write(line);
        writer.newLine();
        writer.flush();
    }
    //客户端,已经传完了
    socket.shutdownOutput();//关闭输出通道,服务端那边就不会阻塞了
    //我要读取服务端的反馈
    InputStream inputStream = socket.getInputStream();
    byte[] bytes = new byte[1024];
    int len = inputStream.read(bytes);
    System.out.println(new String(bytes, 0, len));
    reader.close();
    socket.close();
}
}
服务端
public class TCPServer {
public static void main(String[] args) throws IOException {
    //服务端上传文件完成了之后,给客户端一个反馈
    ServerSocket ss = new ServerSocket(9999);
    System.out.println("服务器已经开启....");
    Socket socket = ss.accept();
    InputStream in = socket.getInputStream();
    //把通道中的输入流包装成字符流
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));

    //关联一个输出流
    BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("msg1.txt"));

    String line=null;
    while ((line=reader.readLine())!=null){
        bufferedWriter.write(line);
        bufferedWriter.newLine();
        bufferedWriter.flush();
    }
    System.out.println("=====================");
    //保存完毕后,给客户端一个反馈
    OutputStream outputStream = socket.getOutputStream();
    outputStream.write("文件上传成功".getBytes());

    //释放资源
    bufferedWriter.close();
    ss.close();

}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值