java4-网络编程
字节流传输
服务器
import java.io.InputStream; import java.lang.Thread; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; public class test { public static void main(String[] args) throws Exception { // System.out.println(InetAddress.getLocalHost().getHostAddress()); //获取本机的ip地址 ServerSocket serverSocket = new ServerSocket(35038); //创建socket套接字并指定端口 System.out.println("服务端开始进行监听"); Socket sk1 = serverSocket.accept(); //使用serversocket进行监听,如果监听到就指定到sk1 System.out.println("有连接上"); InputStream inputStream=sk1.getInputStream(); while (true){ byte[] data=new byte[1024]; inputStream.read(data); //一直在这接收,并且只接收1024一次 System.out.println(new String(data,"utf8")); } } }
客户端
import java.io.OutputStream; import java.net.Socket; import java.util.Scanner; public class client { public static void main(String[] args) { try { Scanner scanner=new Scanner(System.in); Socket sk1=new Socket("127.0.0.1",35038); //写连接服务器的ip和端口号 OutputStream outputStream=sk1.getOutputStream(); while (true){ String neirong=scanner.nextLine(); byte[] data= neirong.getBytes("utf-8"); if (data.length>1024){ System.out.println("输入的数据太长了"); } else{ outputStream.write(data); } } } catch(Exception e){ System.out.println(e); } } }
字符流
服务器
import java.io.DataInputStream; import java.io.InputStream; import java.lang.Thread; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; public class test { public static void main(String[] args) throws Exception { // System.out.println(InetAddress.getLocalHost().getHostAddress()); //获取本机的ip地址 ServerSocket serverSocket = new ServerSocket(35038); //创建socket套接字并指定端口 System.out.println("服务端开始进行监听"); Socket sk1 = serverSocket.accept(); //使用serversocket进行监听,如果监听到就指定到sk1 System.out.println("有连接上"); InputStream inputStream=sk1.getInputStream(); DataInputStream dataInputStream=new DataInputStream(inputStream); //将字节流变成字符流 while (true){ System.out.println(dataInputStream.readUTF()); //输出 } } }
客户端
import java.io.DataOutputStream; import java.io.OutputStream; import java.net.Socket; import java.util.Scanner; public class client { public static void main(String[] args) { try { Scanner scanner=new Scanner(System.in); Socket sk1=new Socket("127.0.0.1",35038); //写连接服务器的ip和端口号 OutputStream outputStream=sk1.getOutputStream(); DataOutputStream dataOutputStream=new DataOutputStream(outputStream); //将字节流包装成字符流 while (true){ String neirong=scanner.nextLine(); dataOutputStream.writeUTF(neirong); } } catch(Exception e){ System.out.println(e); } } }
双线程同时收发
服务器
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.InputStream; import java.lang.Thread; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class server { public static void main(String[] args) throws Exception { /*-----初始化socket服务得到sk1-----*/ ServerSocket serverSocket = new ServerSocket(35038); //创建socket套接字并指定端口 System.out.println("服务端开始进行监听"); Socket sk1 = serverSocket.accept(); //使用serversocket进行监听,如果监听到就指定到sk1 /*-----线程1发送线程设置启动-----*/ Server_send server_send=new Server_send(sk1); server_send.start(); /*-----主线程接收线程主体部分-----*/ InputStream inputStream=sk1.getInputStream(); DataInputStream dataInputStream=new DataInputStream(inputStream); //将字节流变成字符流 while (true){ System.out.println(dataInputStream.readUTF()); //输出 } } } class Server_send extends Thread{ private Socket send_server; //sk1传到这 public Server_send(){ } public Server_send(Socket socket){ this.send_server=socket; } public void run(){ try{ /*-----线程1发送线程主体部分-----*/ Scanner scanner=new Scanner(System.in); System.out.println("服务端开始进行监听-send"); DataOutputStream dataOutputStream=new DataOutputStream(send_server.getOutputStream()); while (true){ System.out.println("请输入想要发送的内容"); String neirong=scanner.nextLine(); dataOutputStream.writeUTF(neirong); } }catch (Exception e){} } }
客户端
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.OutputStream; import java.net.Socket; import java.util.Scanner; public class client { public static void main(String[] args) { try { /*-----初始化socket得到sk1-----*/ Scanner scanner=new Scanner(System.in); Socket sk1=new Socket("127.0.0.1",35038); //写连接服务器的ip和端口号 /*-----线程1接收线程设置启动-----*/ Client_recv client_recv=new Client_recv(sk1); client_recv.start(); /*-----主线程发送线程主体部分-----*/ OutputStream outputStream=sk1.getOutputStream(); DataOutputStream dataOutputStream=new DataOutputStream(outputStream); //将字节流包装成字符流 while (true){ System.out.println("请输入想传输的内容"); String neirong=scanner.nextLine(); dataOutputStream.writeUTF(neirong); } } catch(Exception e){ System.out.println(e); } } } class Client_recv extends Thread{ private Socket recv_server; public Client_recv(){ } public Client_recv(Socket socket){ this.recv_server=socket; } public void run(){ try{ /*-----线程1接收线程主体部分-----*/ DataInputStream dataInputStream=new DataInputStream(recv_server.getInputStream()); while (true){ String data=dataInputStream.readUTF(); System.out.println(data); } }catch (Exception e){} } }
检测连接人员离线。多客户端发给服务端信息
服务端
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.InputStream; import java.lang.Thread; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** * zqh设计,一开始先是初始化Socket_obj对象,它里面定义了专门存放(传心跳包对象的数组,消息收发的数组,用户名的数组),第二步是开启循环监听,如果有socket对象 * 连接建立成功,就首先判断有没有达到连接上限,到达上限就拒绝连接,否则将(传心跳包Socket,消息收发的Socket,用户名)存放到各自的数组里 * 放完之后开启发送心跳包的线程和接收消息的线程。发送心跳包的线程里当前socket连接不断向用户端发消息,如果发不通,就说明用户离线,就把该用户从 * socket对象的数组里面抹掉 博客园https://www.cnblogs.com/zqh962903415/ **/ //socket存放对象 class Socket_obj { private static int link_num=2; //socket列表的长度 private static List socketlist =new ArrayList(); //socket列表 private static List namelist =new ArrayList(); private static List messagelist =new ArrayList(); int get_num(){ return link_num; //获取长度值 } List get_socklist(){ return socketlist; //获取soket列表 } List get_namelist(){ return namelist; //获取soket列表 } List get_messagelist(){ return messagelist; //获取soket列表 } void set_sl(List list){ socketlist=list; //修改socket列表 } void set_nl(List list){ namelist=list; //修改socket列表 } void set_ml(List list){ messagelist=list; } @Override public String toString() { return super.toString(); } } /*---------检测在线状态sk--------------*/ class Check_online extends Thread { private Socket sk; //!!!!sk不能是静态的,每个用户的sk都不同 private Socket msk; //!!!!msk不能是静态的,每个用户的msk都不同 private static Socket_obj socket_obj; //socket存放对象大家引用的应该是相同的 private String username; //username非静态,每个用户都不同 Check_online(Socket sk,Socket msk,Socket_obj socket_obj,String username) { this.sk = sk; this.msk=msk; this.username=username; Check_online.socket_obj=socket_obj; } public void run() { try { while (true) { //!!!!!!直接服务端发心跳包给客户端行了,如果拿着对象的sk发,发不出去就直接在异常那里消掉它 DataOutputStream dataOutputStream=new DataOutputStream(sk.getOutputStream()); dataOutputStream.writeUTF("2"); //每1s向客户端发送2(心跳) Thread.sleep(1000); } } catch (Exception e) { System.out.println("有人离线"); //连接不通就到这 try{sk.close();msk.close();}catch (Exception f){} //心跳和消息的socket都给他断开 synchronized (socket_obj) { //同步锁socket——obj对象,一个线程修改完这个另一个线程才能改这个 List new_sl = socket_obj.get_socklist(); //获取当前的心跳包socket数组 new_sl.remove(sk); //删掉当前离线的 socket_obj.set_sl(new_sl); //更新 List new_nl = socket_obj.get_namelist(); new_nl.remove(username); socket_obj.set_nl(new_nl); List new_ml = socket_obj.get_messagelist(); new_ml.remove(msk); socket_obj.set_ml(new_ml); } } } } /*---------消息接收口msk----------------*/ class Sev_m_rec extends Thread{ private Socket socket; Sev_m_rec(Socket socket){ this.socket=socket; } public void run(){ try { while (true){ DataInputStream dataInputStream=new DataInputStream(socket.getInputStream()); System.out.println(dataInputStream.readUTF()); } }catch (Exception e){} } } /*------------主程序——————————————————————*/ public class Server { public static void main(String[] args) throws Exception { /*-----初始化socket对象-----*/ Socket_obj socket_obj = new Socket_obj(); //实例化socket列表对象 int link_num = socket_obj.get_num(); //获取列表的长度 /*-----------------------*/ ServerSocket serverSocket = new ServerSocket(35038); //创建socket套接字并指定端口 /*---------并发socket监听---------*/ while (true) { Socket sk = serverSocket.accept(); //使用serversocket进行监听,如果监听到就指定到sk Socket msk = serverSocket.accept(); // System.out.println("服务端开始进行监听"); if (socket_obj.get_socklist().size()>link_num-1) { //超过link_num就不让连接 Thread.sleep(1000); sk.close(); msk.close(); continue; }else { DataInputStream dataInputStream = new DataInputStream(sk.getInputStream()); String username = dataInputStream.readUTF(); //接收客户端发来的用户名消息 /*------socketlist里面的是心跳包操作,判断是否在线的socket*/ synchronized (socket_obj) { //同步socket_obj,一个线程修改完之后另一个线程才能对它进行修改 List sl_new = socket_obj.get_socklist(); //获取当前的心跳包socket数组 sl_new.add(sk); //增加当前连接进来的 socket_obj.set_sl(sl_new); //更新 /*-----namelist里面放的是用户名*/ List ml_new = socket_obj.get_messagelist(); ml_new.add(msk); socket_obj.set_ml(ml_new); /*------messagelist里面放的是消息传输的socket----*/ List nl_new = socket_obj.get_namelist(); nl_new.add(username); socket_obj.set_nl(nl_new); } System.out.println(socket_obj.get_socklist().toString()); Check_online check_online = new Check_online(sk, msk, socket_obj, username); //开检测在线状态线程 check_online.start(); Sev_m_rec sev_m_rec = new Sev_m_rec(msk); //开信息接收线程 sev_m_rec.start(); } } } }
客户端
import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.Socket; import java.util.Scanner; //class Mes_rec extends Thread{ // private Socket socket; // Mes_rec(Socket socket){ // this.socket=socket; // } // public void run(){ // try { // DataInputStream dataInputStream=new DataInputStream(socket.getInputStream()); // while(true){ // System.out.println(dataInputStream.readUTF()); // } // }catch (Exception e){} // } //} class Mes_send extends Thread{ private Socket socket; private String username; Mes_send(Socket socket,String username){ this.socket=socket; this.username=username; } Scanner scanner=new Scanner(System.in); public void run(){ try { DataOutputStream dataOutputStream=new DataOutputStream(socket.getOutputStream()); while(true){ System.out.println("请输入想要发送的内容:"); String neirong=username+"说到:"+scanner.nextLine(); dataOutputStream.writeUTF(neirong); } }catch (Exception e){} } } class Client1 { public static void main(String[] args) { try { System.out.println("请输入用户名"); Scanner scanner=new Scanner(System.in); String username= scanner.nextLine(); /*-----初始化socket得到sk1-----*/ Socket sk1=new Socket("127.0.0.1",35038); //sk1心跳包socket Socket msk=new Socket("127.0.0.1",35038); //msk消息收发socket /*------接收服务器发过来的状态------*/ DataOutputStream dataOutputStream=new DataOutputStream(sk1.getOutputStream()); dataOutputStream.writeUTF(username); Thread.sleep(1000); // Mes_rec mes_rec=new Mes_rec(msk); // mes_rec.start(); Mes_send mes_send=new Mes_send(msk,username); mes_send.start(); while(true){ dataOutputStream.writeUTF("1"); Thread.sleep(1000); } /*----------------------------*/ } catch(Exception e){ System.out.println("未连接到服务器,请重新启动"); } } }

浙公网安备 33010602011771号