JAVA网络编程之socket

JAVA Socket 编程

socket——TCP通信

accept方法阻塞请求,无法并发,效率太低,如果当前的请求没有处理完,那么后面的请求只能被阻塞,服务器的吞吐量太低。

server服务端

public class server {
  
  public static void main(String[] args) throws IOException {
  
    //打开一个连接
    ServerSocket server = new ServerSocket(1000);
    Socket socket = server.accept();
  
    //接收数据并打印
    InputStream inputStream = socket.getInputStream();
    byte[] bytes = new byte[1024];
    StringBuilder stringBuilder = new StringBuilder();
    int len;
    while((len = inputStream.read(bytes)) != -1){
      stringBuilder.append(new String(bytes,0,len,"UTF-8"));
    }
    System.out.println("get "+stringBuilder);
  
//    回传数据
//    OutputStream outputStream = socket.getOutputStream();
//    outputStream.write("Hello Client,I get the message.".getBytes("UTF-8"));
//    outputStream.close();
    
    inputStream.close();
    socket.close();
    server.close();
  } 
}

client客户端

public class client {
  
  public static void main(String[] args) throws IOException {
    
    Socket socket = new Socket("127.0.0.1",1000);
    
    //输出数据到服务器
    String message = "hello world!";
    OutputStream outputStream = socket.getOutputStream();
    outputStream.write(message.getBytes("UTF-8"));
    
  	//通过shutdownOutput告诉服务器已经发送完数据,后续只能接受数据
//    socket.shutdownOutput();    

	//接收数据
//    InputStream inputStream = socket.getInputStream();
//    byte[] bytes = new byte[1024];
//    StringBuilder sb = new StringBuilder();
//    int len = 0;
//    while((len = inputStream.read(bytes))!=-1){
//      sb.append(new String(bytes,0,len));
//    }
//    System.out.println("get from server "+sb);
//    inputStream.close();
    
    outputStream.close();
    socket.close();
  }
}

DatagramSocket——UDP通信

Socket使用的tcp连接,需要先连接之后才能发送数据。
DatagramSocket使用的UDP连接,客户端不需要先连接数据,可以直接发送给指定服务端。

client客户端

public class client {
  
  public static void main(String[] args) throws IOException {
  
    DatagramSocket client = new DatagramSocket(666);
    String msg = "I love you!";
    byte[] bytes = msg.getBytes();
    
    //创建一个DatagramPacket对象,用于发送数据。
    //参数一:要发送的数据  参数二:数据的长度  参数三:服务端的网络地址  参数四:服务器端端口号
    DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length,new InetSocketAddress("127.0.0.1",1024));
    
    client.send(datagramPacket);

    client.close(); 
  } 
}

server服务端

public class server {
  public static void main(String[] args) throws IOException {
  
    //创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求
    DatagramSocket server = new DatagramSocket(1024);
    byte[] container = new byte[1024];
    
    DatagramPacket datagramPacket = new DatagramPacket(container,container.length);
    
    //接收数据
    server.receive(datagramPacket);
    byte[] msg = datagramPacket.getData();
    int length = msg.length;
    String message = new String(msg,0,length);
    System.out.println(message);
    
    server.close();
  }
}

相关API、类及其描述

API 或 类描述
ServerSocketSocket类代表一个客户端套接字,即任何时候连接到一个远程服务器应用时构建所需的socket。现在,要实现一个服务器应用,需要不同的做法。服务器需随时待命,因为不知道客户端什么时候会发来请求,此时,我们需要使用ServerSocket,对应的是java.net.ServerSocket类。 ServerSocket与Socket不同,ServerSocket是等待客户端的请求,一旦获得一个连接请求,就创建一个Socket示例来与客户端进行通信。
Socket根据指定服务端的 IP 地址或端口号构造 Socket 类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。
accept()监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象
shutdownOutput()通过shutdownOutput高速服务器已经发送完数据,后续只能接受数据
DatagramSocket基于UDP 协议进行通信的包装类,创建客户端,UDP数据报通过数据报套接字 DatagramSocket 发送和接
DatagramPacket封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号
receive()接收DatagramPacket数据
send()发送datagramPacket数据报
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
import java.io.*; import java.net.*; import java.util.*; import java.lang.*; public class Server extends ServerSocket { private static ArrayList User_List = new ArrayList(); private static ArrayList Threader = new ArrayList(); private static LinkedList Message_Array = new LinkedList(); private static int Thread_Counter = 0; private static boolean isClear = true; protected static final int SERVER_PORT = 10000; protected FileOutputStream LOG_FILE = new FileOutputStream( "d:/connect.log", true); public Server() throws FileNotFoundException, IOException { super(SERVER_PORT); // append connection log // Calendar now = Calendar.getInstance(); // String str = "[" + now.getTime().toString() + // "] Accepted a connection"; // byte[] tmp = str.getBytes(); // LOG_FILE.write(tmp); try { Socket socket = accept(); while (true) { new ServerReaderThread(socket); new ServerWriterThread(socket); } } finally { close(); } } public static void main(String[] args) throws IOException { new Server(); } // --- CreateServerThread class ServerReaderThread extends Thread { private Socket client; private BufferedReader in; private PrintWriter out; private String Username; public ServerReaderThread(Socket s) throws IOException { client = s; in = new BufferedReader(new InputStreamReader(client .getInputStream())); out = new PrintWriter(client.getOutputStream(), true); start(); } public void run() { try { int flag = 0; Thread_Counter++; String line = in.readLine(); while (!line.equals("bye")) { out.println(line); line = in.readLine(); } out.println("--- See you, bye! ---"); // System.out.println("--- See you, bye! ---"); client.close(); } catch (IOException e) { } finally { try { client.close(); } catch (IOException e) { } Thread_Counter--; } } } // --- CreateServerThread class ServerWriterThread extends Thread { priva

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值