Java Socket通信及TCP/UDP实现

记得上一次接触socket这一块还是在大三抓耳挠腮的整毕设的时候,两年后的今天又用到了它,那就把Socket实现组播什么的做一个记录吧。

TcpServer

public class TcpServer {
	private static boolean isruning = true;

	public static void main(String[] args) {
		try {
			ServerSocket serverSocket = new ServerSocket(5583);
			while (isruning) {
				// 连接
				Socket socket = serverSocket.accept();
				System.out
						.println("有新客户端(" + socket.getInetAddress() + ")连接。。");
				OutputStream stream = socket.getOutputStream();
				OutputStreamWriter writer = new OutputStreamWriter(stream);
				writer.write("hello socket!");
				writer.flush();
				writer.close();
				System.out
						.println("客户端(" + socket.getInetAddress() + ")会话结束。。");
			}
			serverSocket.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

TcpClient

public class TcpClient {

	public static void main(String[] args) {
		String host = "localhost"; // 要连接的服务端IP地址
		int port = 5583; // 要连接的服务端对应的监听端口
		try {
			// 与服务端建立连接
			Socket client = new Socket(host, port);
			InputStream inputStream = client.getInputStream();
			InputStreamReader reader = new InputStreamReader(inputStream);
			BufferedReader bufferedReader = new BufferedReader(reader);
			String message = bufferedReader.readLine();
			System.out.println(message);
			bufferedReader.close();
			client.close();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

UdpSend

public class UdpSend {
	public static void main(String[] args) {
		MulticastSocket socket;
		try {
			socket = new MulticastSocket(8842);
			socket.setTimeToLive(1);
			InetAddress address = InetAddress.getByName("233.0.0.0");
			socket.joinGroup(address);
			byte[] buf = "hello world!".getBytes();
			DatagramPacket p = new DatagramPacket(buf, buf.length, address,
					8842);
			socket.send(p);
			System.out.println("广播已经发出");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

UdpReceive

public class UdpReceive {

	public static void main(String[] args) {
		MulticastSocket socket;
		try {
			socket = new MulticastSocket(8842);
			socket.setTimeToLive(1);
			InetAddress address = InetAddress.getByName("233.0.0.0");
			socket.joinGroup(address);
			byte[] buf = new byte[3000];
			DatagramPacket p = new DatagramPacket(buf, buf.length);
			socket.receive(p);
			System.out.println("接受到" + p.getAddress() + "的广播消息"
					+ new String(p.getData()));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

2019年1月4日16:43:00 更新 ----------------------------------

后来实现的,比上个版本更好一点 贴上来

public class cfg {
    public static String ip = "192.168.0.106";
    public static int port = 8030;
}

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
    public static void main(String[] args) {
        try {
            // 与服务端建立连接
            Socket client = new Socket(cfg.ip, cfg.port);
            System.out.println("连接成功!");
            new Send(client).start();
            new Recerver(client).start();
            //socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

import com.sun.xml.internal.messaging.saaj.util.ByteInputStream;

import java.io.*;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;

public class Recerver extends Thread {
    Socket socket;

    public Recerver(Socket client) {
        this.socket = client;
    }

    @Override
    public void run() {
        super.run();
        InputStream inputStream = null;
        try {
            inputStream = socket.getInputStream();
            for (; ; ) {
                DataInputStream stream = new DataInputStream(inputStream);
                int head = -1;
                while ((head = stream.read()) != 0xff) {
                    System.out.print("bad data");
                }
                System.out.print("head:" + head);
                int len = stream.readInt();
                byte[] data = new byte[len];
                stream.read(data, 0, len);
                String str = new String(data, Charset.forName("utf-8"));
                System.out.println(socket.getInetAddress() + ":" + str);
            }
        } catch (IOException e) {
            System.out.println(socket.getInetAddress() + " 已经断开");
        }
    }
}

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.util.Scanner;

public class Send extends Thread {
    Socket socket;

    public Send(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        super.run();
        try {
            OutputStream out = socket.getOutputStream();
            Scanner scanner = new Scanner(System.in);
            for (; ; ) {
                String msg = scanner.nextLine();
                byte[] content = msg.getBytes("utf-8");
                ByteBuffer byteBuffer = ByteBuffer.allocate(content.length + 5);
                byteBuffer.put((byte) 0xff);
                byteBuffer.putInt(content.length);
                byteBuffer.put(content);
                out.write(byteBuffer.array());
                out.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;

public class Server {

    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(cfg.port);
            System.out.println("服务启动:" + InetAddress.getLocalHost().getHostAddress() + ":" + serverSocket.getLocalPort());
            for (; ; ) {
                // 连接
                Socket socket = serverSocket.accept();
                System.out
                        .println("有新客户端(" + socket.getInetAddress() + ")连接");
                new Send(socket).start();
                new Recerver(socket).start();
            }
            //serverSocket.close();
        } catch (IOException e) {
            System.out.print("服务端异常:" + e.getMessage());
        }
    }
}
发布了46 篇原创文章 · 获赞 62 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/qq_27512671/article/details/77185859