首页 > 其他分享 >Scoket 传输代码实现

Scoket 传输代码实现

时间:2023-11-16 17:23:45浏览次数:26  
标签:Scoket 代码 private 传输 new sc import public String

前提 : 开发工具 : IDEA ,创建包 : com.north.test , 才能直接复制

服务端

package com.north.test;

import javax.swing.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;

public class server {
    private ServerSocket ss = null; //用以指明服务器的端口号和接受来自客户端的信息
    private Socket sc =null; //服务器的套接字
    private static int pocket = 8888; //端口号
    private InputStream ips = null; //输出流
    private  boolean start = false; //判断服务器是否启动
    private static JFrame jf = new JFrame(); //GUI界面
    private static JTextArea ja = new JTextArea(10, 20); //GUI界面
    private ArrayList<Thread_server> ccList = new ArrayList<Thread_server>(); //构造容器来存储客户端


    //主函数入口
    public static void main(String[] args) {
        server s = new server();
        s.init_gui(); //初始化GUI界面
        s.getmassage(); //服务器端得到信息后的操作
    }


    //初始化GUI界面
    public static void init_gui(){
        jf.setBounds(300, 300, 400, 400);
        jf.setTitle("服务器窗口");
        //设置为不可编辑
        ja.setEditable(false);
        //添加组件
        jf.add(ja);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setVisible(true);
    }

    //服务器端得到信息后的操作
    public  void getmassage(){
        try{
            //指明服务器端的端口号并创建服务器端的socket
            ss = new ServerSocket(pocket);
            start = true;//服务器已经打开
            //因为要实现多人聊天,因此需要循环监听客户端
            while(start){
                sc = ss.accept(); //服务器的套接字和客户端的套接字连接
                System.out.println("一个客户端已加入连接:"+sc.getPort()); //打印消息
                ja.append("服务器信息:一个客户端连接服务器" + sc.getInetAddress() + "/" + sc.getPort()+'\n'); //GUI界面中打印消息
                //因为可能存在有多个客户端连接,因此需要创建多线程来实现
                Thread_server ts = new Thread_server(sc);
                ccList.add(ts); //用集合来储存客户端的socket
                ts.start(); //线程的启动
            }
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            if(ss!=null){
                try {
                    ss.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(sc!=null){
                try {
                    sc.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(ips!=null){
                try {
                    ips.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }



    //创建多线程的内部类
    class Thread_server extends Thread{
        Socket sc = null;

        public Thread_server(Socket sc){
            this.sc = sc;
        }

        @Override
        //服务器端接受并反馈来自客户端的信息
        public void run() {
            InputStream ips = null;
            try{
                ips = sc.getInputStream();
                byte[] b = new byte[1024];
                int len;
                String str = null;
                while((len=ips.read(b))!=-1){
                    str = new String(b);
                    System.out.println(str);
                    ja.append(str+'\n');

                    //服务器端给所有的客户端发送消息
                    Iterator<Thread_server> iterator = ccList.iterator();
                    while (iterator.hasNext() && ccList.size()>=2) {
                        Thread_server th = iterator.next();
                        if(th.sc != sc){
                            th.sendmassage(str); //发送消息的函数
                        }
                    }
                    //初始化byte[] 数组
                    for(int i = 0 ; i<1024 ; i++){
                        b[i]=0;
                    }
                }
            }catch (IOException e){
                e.printStackTrace();
            }finally {
                try {
                    ips.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        //服务器端给每个客户端发送消息
        public void sendmassage(String str){
            OutputStream ops = null;
            try {
                ops = sc.getOutputStream();
                ops.write(str.getBytes());
            } catch (IOException e) {
                e.printStackTrace();
            }

        }


    }
}

JavaBean

package com.north.test;

public class customer {
    private String name;
    String id;
    String mima;

    public customer(String name,String id,String mima){
        this.name = name;
        this.id = id;
        this.mima = mima;
    }

    public customer(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

客户端

package com.north.test;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;

public class client {
    private Socket sc = null; //客户端的套接字
    private  InputStream ips = null;
    private OutputStream ops = null;
    private static int pocket = 8888;
    private static String ip ="127.0.0.1"; //服务器端的ip地址,这里用的就是本机地址
    private  customer cust = null; //customer实体类
    private boolean first = true; //判断该客户端是否是第一次给服务器端发信息
    private JTextArea ja;
    private JFrame jf;
    private JTextField jt;

    //创建用户名
    public  void customer_init(){
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入姓名:");
        String name = sc.next();
        cust = new customer(name);

    }

    //给服务器端发送消息的方法
    public void send(String str){
        try{
            ops = sc.getOutputStream();
            if(first){
                ops.write(("                  \t        "+str+'\n').getBytes());
                first = false;
            }else {
                ops.write((this.cust.getName() + "说:" + str).getBytes());
                //ja.append("我说:"+str+'\n');
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }


    //主函数入口
    public static void main(String[] args) {
        client c = new client();
        c.customer_init();
        try{
            c.sc = new Socket(ip,pocket); //指明服务器端的ip和端口
            c.send(c.cust.getName()+"加入聊天室,大家欢迎");
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        c.init_window();
    }

    //界面初始化
    public void init_window(){
        jf = new JFrame();
        jf.setBounds(300, 100, 400, 400);
        jf.setTitle("客户端窗口");
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //聊天记录显示区
        ja = new JTextArea(10, 20);
        ja.setEditable(false);
        //聊天记录输入区
        jt = new JTextField(20);
        //添加窗口监听器,实现发送消息的功能
        jt.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String strSend = jt.getText();
                // 去掉空格判断长度是否为空
                if (strSend.trim().length() == 0) {
                    return;
                }
                //客户端信息strSend发送到服务器上
                jt.setText("");
                ja.append("我说:"+strSend+'\n');
                send(strSend);
                //多线程接受来自服务器的消息
                new Thread(new Receive()).start();
            }
        });
        jf.add(ja, BorderLayout.CENTER);
        jf.add(jt,BorderLayout.SOUTH);
        jf.setVisible(true);
    }


    //多线程的内部类,用以接受服务器的消息
    class Receive implements Runnable {
        @Override
        public void run() {
            try {
                while (true) {
                    InputStream ips = sc.getInputStream();
                    int len;
                    byte[] b = new byte[1024];
                    String str = null;
                    while((len=ips.read(b))!=-1){
                        str = new String(b);
                        //通讯消息
                        ja.append(str+'\n');
                    }
                }
            } catch (SocketException e) {
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

标签:Scoket,代码,private,传输,new,sc,import,public,String
From: https://www.cnblogs.com/NorthPoet/p/17836799.html

相关文章

  • 使用MobaTextEditor编辑的代码在linux上运行报错
    在windows上通过ssh登录linux节点处理数据,使用MobaTextEditor编辑shell脚本后,在linux上运行总是报错找不到路径 报错 其根本原因是windows下每一行的结尾符是\n\r,而linux下是\n,所以windows下编写的shell脚本拷贝到linux下时会多一个\r,在运行时会乱码在运行前通过以下命令......
  • 如何l利用`ThreadLocal`、`HandlerInterceptor`、`HandlerMethodArgumentResolver`来
    核心类ThreadLocal、HandlerInterceptor、HandlerMethodArgumentResolver1.ThreadLocal2.WebMvcConfigurer -addArgumentResolvers3.HandlerMethodArgumentResolver -supportsParameter -resolveArgumentThreadLocal:可以理解为一个线程安全的Map。//用户上下......
  • 微服务 在 Java 代码中发送 http 请求(跨服务远程调用)
    1.注册RestTemplate对象到Spring容器中(Bean的注入只能放在配置类里,而启动类本身就是配置类)@SpringBootApplicationpublicclassOrderServiceApplication{publicstaticvoidmain(String[]args){SpringApplication.run(OrderServiceApplication.class,......
  • 安防监控LiteCVR平台视频画面六分屏的开发步骤(附代码)
    视频监控分屏画面技术是一种用于同时显示多个监控摄像头画面的技术。全屏显示时,单一摄像头占据整个屏幕,提供对单个区域的详细监控。多画面分屏则支持将多个摄像头的画面以网格形式分割在同一屏幕上,便于同时监控多个区域。视频监控联网LiteCVR视频集中存储平台不仅支持1、4、9、1......
  • 代码迭代:软件开发者在众包平台的发展之路
    在当今数字化时代,互联网众包平台已成为软件开发领域的一片热土,为开发者提供了更广阔的发展空间。然而,在这个虚拟的技术王国中,软件技术开发人员与互联网众包平台之间并非一帆风顺,而是面临着一系列的牵绊,当然,这局面,既是挑战,也是机遇。  多样性的项目需求与开发者技术栈的匹配问题 ......
  • PCL点云滤波代码
    PCL点云滤波代码实例1.直通滤波:PassThrough直接指定保留哪个轴上的范围内的点#include<pcl/filters/passthrough.h>如果使用线结构光扫描的方式采集点云,必然物体沿z向分布较广,但x,y向的分布处于有限范围内。此时可使用直通滤波器,确定点云在x或y方向上的......
  • 警惕!91%的开源代码库存在无人维护的开源代码!
    根据Synopsys发布的《2023开源安全和风险分析》报告显示:调研的软件系统中,有76%的软件包含开源软件组件。平均每个代码库由80%的开源代码组成,84%的代码库中包含至少一个已知开源漏洞,比2022年版的OSSRA报告增加了近4%。另外,报告中也提到,审查的1481个含风险评估的代码库中,91%存在过......
  • 把bsc的合约代码部署到opbnb
    1.找到bsc已经正式部署的合约https://bscscan.com/ 2.拷贝ContractSourceCode把文件导出为xxx.sol 3.把导出的sol文件导入remix编辑器打开remix编辑器https://remix.ethereum.org/#lang=en&optimize=false&runs=200&evmVersion=null&version=soljson-v0.8.18+com......
  • new绑定 ---- new一个对象所作的四件事情 新建一个对象 把this的指向指向这个对象
    下面对this对象的理解,哪些是正确的Athis总是指向函数的直接调用者(而非间接调用者);B如果有new关键字,this指向new出来的那个对象;C在事件中,this总是指向触发这个事件的对象;Dthis是函数运行时自动生成的一个内部对象,只能在函数内部使用;正确答案:B在事件中,this指向触发这个事......
  • C语言劳动节祝福程序代码
    帮您编写一段祝福程序代码,以下是一个400字以上的C语言劳动节祝福程序代码示例:#include<stdio.h>intmain(){//定义劳动节祝福语char*greetings[]={"在劳动节来临之际,向辛勤工作的您致以最诚挚的祝福!","感谢您为国家、为社会做出的无私贡献,祝......