socket多个连接与多个线程

来源:互联网 发布:批量update mysql 编辑:程序博客网 时间:2024/06/05 08:50

1.Runnable类处理socket数据

package socket.helloworld;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;/** * @author 传递一个socket对象创建线程 * */public class Server_Runnable implements Runnable {public Socket socket;Server_Runnable(Socket socket){this.socket = socket;}@Overridepublic void run() {try {//1.从每个socket获取输入输出流中获取相关消息InputStream in = socket.getInputStream();OutputStream out = socket.getOutputStream();//2.获取流中的数据,直接读取byte数组,然后转换成字符串byte[] array = new byte[100];if(in.read(array)>0){System.out.println("获取到client消息  :"+new String(array));}//3.向客户端回传数据String hashcode = "("+this.hashCode()+")";out.write(hashcode.getBytes());//3.关闭连接socket.close();} catch (Exception e) {e.printStackTrace();}}}

2.server端程序

package socket.helloworld;import java.io.IOException;import java.net.Inet4Address;import java.net.Inet6Address;import java.net.InetAddress;import java.net.NetworkInterface;import java.net.ServerSocket;import java.net.Socket;import java.net.SocketException;import java.net.UnknownHostException;import java.util.Enumeration;import java.util.List;import com.sun.org.apache.xerces.internal.impl.dv.dtd.IDREFDatatypeValidator;public class socket_test {public static void main(String[] args) {socket_test test = new socket_test();//test.printAddress();test.createSocket();}//通过NetworkInterface获取InteAddress在获取ip地址@SuppressWarnings("rawtypes")public void printAddress(){try {//创建枚举类//1.NetworkInterface对象可以访问主机接口//2.Enumeration对象包含了一个InteAddress对象//3.InteAddress对象可以获取主机ipEnumeration<NetworkInterface> list = NetworkInterface.getNetworkInterfaces();//遍历枚举类对象获取每一个NetworkInterfacewhile(list.hasMoreElements()){NetworkInterface iface = list.nextElement();System.out.println("interface name :"+iface.getName());System.out.println("-------------------------------------------------------------------------------------------");//获取InetAddress枚举类对象并遍历Enumeration<InetAddress> address =  iface.getInetAddresses();while(address.hasMoreElements()){InetAddress ad = address.nextElement();//判断是ipv4还是ipv6if(ad instanceof Inet4Address){System.out.println("Ipv4 : "+ad.getHostAddress());}else if(ad instanceof Inet6Address){System.out.println("Ipv6 : "+ad.getHostAddress());}}}} catch (SocketException e) {e.printStackTrace();}}//创建服务端socketpublic void createSocket(){try {//1.通过静态方法直接或获取localhost的ip地址,返回的是一个InetAddress对象,服务端建立socket不需要ip地址,客户端才需要这个ip地址InetAddress address = InetAddress.getLocalHost();System.out.println("localHost ip: "+address.getHostAddress());System.out.println("localHost name: "+address.getHostName());//2.创建一个SeverSocket,监听2000端口号ServerSocket server_socket = new ServerSocket(2000);while(true){//3.每次客户端请求一个socket连接都创建一个新线程来处理,线程run中获取输入输出流Socket socket = server_socket.accept();Thread thread = new Thread(new Server_Runnable(socket));thread.start();}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

3.client端程序

package socket.helloworld;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.net.UnknownHostException;import org.eclipse.jdt.internal.compiler.ast.ThisReference;public class socket_test {public static void main(String[] args) {socket_test test = new socket_test();//创建多个个socket并发送数据test.send_data(test.creatSocket(), "数据1");test.send_data(test.creatSocket(), "数据2");test.send_data(test.creatSocket(), "数据3");test.send_data(test.creatSocket(), "数据4");test.send_data(test.creatSocket(), "数据5");test.send_data(test.creatSocket(), "数据6");test.send_data(test.creatSocket(), "数据7");test.send_data(test.creatSocket(), "数据8");test.send_data(test.creatSocket(), "数据9");}//创建客户端socket,send_data是要发送的数据public Socket creatSocket(){try {Socket socket = new Socket("192.168.31.170", 2000);return socket;} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}//每个socket发送一个send_data字符串,然后关闭socketpublic void send_data(Socket socket,String send_data){try {if(socket!=null){InputStream in = socket.getInputStream();OutputStream out = socket.getOutputStream();//1.发送数据System.out.println("发送了 :"+send_data);out.write(send_data.getBytes());//2.获取数据byte[] array = new byte[100];if(in.read(array)>0){System.out.println("收到了 server 回传数据 :"+new String(array));}socket.close();}} catch (Exception e) {e.printStackTrace();}}}