JAVA网络编程服务器多线程接受套接字,如何能使服务器的静态常量,与客户端的数据进行同步?

服务器Server
客户端CLient
Server静态常量num
创建服务器,ServerSocket的端口号为8000,连接套接字。
每创建一个客户端,客户端就创建一个Socket,端口号为8000,与服务器进行连接,与此同时,客户端新建ServerSocket,端口号为3000+Server.num,连接套接字。
服务器与客户端连接后,服务器新建子线程Handler。
子线程Handler,新建ServerSocket,端口号为2000+Server.num,连接套接字。

每当有一个子线程创建,主线程都会加入一个子线程创建的对话界面(显示框,输入框,发送按钮)的选项卡
每当创建一个客户端,客户端都会创建一个对话界面

点击发送时,Hanlder会创建Socket,端口号为3000+Server.num。客户端会创建Socket,端口号为2000+Server.num

这是前提,现在我运行程序,但是当我每当创建一个客户端时,Server.num都不会改变,不知道怎么回事,急求大神解答,感激不尽!

以下是源代码,这里我讲Server.num抽离出去单独做成一个类NUM,每次Handler创建后,调用该类的增加函数numAdd():

服务器代码:

package NewPackage;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
public class Server {
private ServerSocket serverSocket;
private int PORT = 8000;
private Thread workThread;
private static MyServer server;
public static ArrayList solist = new ArrayList();
public static ArrayList ctlist = new ArrayList();

public Server() throws Exception {
    serverSocket = new ServerSocket(PORT);
}

public void service() {
    while (true) {
        Socket socket = null;
        try {
            String s;
            int num = NUM.num;
            NUM.numadd();
            socket = serverSocket.accept();
            System.out.println(num + 2000);
            workThread = new Thread(new Handler(num + 2000, MyServer.jp));
            workThread.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

public static void main(String args[]) throws Exception {
    server = new MyServer();
    server.CreateGUI();
    new Server().service();
}

}

服务器的界面代码:
package NewPackage;

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;

public class MyServer extends JFrame {

private static final long serialVersionUID = 1L;
static JTextArea contentjta;
static JScrollPane contentscroll;
static JTextArea inputjta;
static JScrollPane inputscroll;
static JButton button;
static JPanel jpanel;
static JTabbedPane jp;

MyServer() {
    super("Server Window");
}

void CreateGUI() {
    jp = new JTabbedPane();
    this.add(jp, BorderLayout.CENTER); // 将选项卡窗体添加到 主窗体上去
    this.setSize(400, 400);
    this.setLocation(400, 200);
    this.setVisible(true);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

}

子线程Handler

package NewPackage;

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;

public class Handler implements Runnable, ActionListener {
private Socket socket;
private PrintWriter pw;
private int order;
private ServerSocket svs;
private MyClient client;
static JTextArea contentjta;
static JScrollPane contentscroll;
static JTextArea inputjta;
static JScrollPane inputscroll;
static JButton button;
static JPanel jpanel;
static JTabbedPane jp;
private BufferedReader br;

public Handler(int n, JTabbedPane jp) {
    try {
        this.jp = jp;
        // this.socket = socket;
        // System.out.println("handler" + socket.getLocalPort());
        order = n ;
        // JOptionPane.showInputDialog(this, order);
        System.out.println("Handler" + order);
        svs = new ServerSocket(order + 1000);
        createTab();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

private PrintWriter getWriter(Socket socket) throws IOException {
    OutputStream socketOut = socket.getOutputStream();
    return new PrintWriter(socketOut, true);
}

private BufferedReader getReader(Socket socket) throws IOException {
    InputStream socketln = socket.getInputStream();
    return new BufferedReader(new InputStreamReader(socketln));
}

void createTab() {
    JPanel chat = new JPanel(new BorderLayout());

    contentjta = new JTextArea(10, 30);
    contentjta.setTabSize(4);
    contentjta.setFont(new Font("楷体", Font.BOLD, 16));
    contentjta.setEditable(false);

    inputjta = new JTextArea(10, 30);
    inputjta.setTabSize(4);
    inputjta.setFont(new Font("楷体", Font.BOLD, 16));
    inputjta.setEditable(true);

    contentscroll = new JScrollPane(contentjta);
    contentscroll
            .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    contentscroll
            .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

    inputscroll = new JScrollPane(inputjta);
    inputscroll
            .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    inputscroll
            .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

    jpanel = new JPanel();
    button = new JButton("发送");
    button.addActionListener(this);

    jpanel.setLayout(new GridLayout(1, 1));
    jpanel.add(button);

    chat.add(contentscroll, BorderLayout.NORTH);
    chat.add(inputscroll, BorderLayout.CENTER);
    chat.add(jpanel, BorderLayout.SOUTH);
    jp.add("aa", chat);
    jp.setFont(new Font("宋体", Font.BOLD, 20));

}

public void run() {
    try {
        // 接受信息
        while (true) {
            Socket socket = svs.accept();
            br = getReader(socket);
            pw = getWriter(socket);
            String msg = null;
            String s = "";
            while ((msg = br.readLine()) != null) {
                s += msg;
                if ((msg.equals("bye")))
                    break;
            }
            contentjta.setText(s);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Override
public void actionPerformed(ActionEvent e) {
    Object o = e.getSource();
    if (o == button) {
        try {
            Socket so = new Socket("localhost", order);
            OutputStream out = so.getOutputStream();
            PrintStream pout = new PrintStream(out);
            pout.print(inputjta.getText());
            inputjta.setText("");
            out.flush();
            out.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }
}

}

1个回答

字数限制,以下是其他内容

客户端代码:
package NewPackage;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Client {
static int PORT = 2000;

public static void main(String[] args) {
    int num = 1;
    MyClient client = new MyClient(3000 + num);
    client.CreateGUI();
    try {
        System.out.println(PORT + num);
        ServerSocket serversocket = new ServerSocket(PORT + num);
        NUM.numadd();
        while (true) {
            Socket socket = serversocket.accept();
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    socket.getInputStream()));
            String msg;
            String s = "";
            while (((msg = br.readLine()) != null)) {
                s += msg;
                if (msg.equals("bye"))
                    break;
            }
            System.out.println(s);
            client.getContentjta().setText(s);
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

}

客户端界面代码:
package NewPackage;

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class MyClient extends JFrame implements ActionListener {

private static final long serialVersionUID = 1L;
static JTextArea contentjta;
static JScrollPane contentscroll;
static JTextArea inputjta;
static JScrollPane inputscroll;
static JButton button;
static JPanel jpanel;
private Socket socket;
private int order;

public static JTextArea getContentjta() {
    return contentjta;
}

public MyClient(int n) {
    super("Client Window");
    order = n;
}

void CreateGUI() {
    // System.out.println("MyClient" + order);
    try {
        socket = new Socket("localhost", 8000);
        socket.close();
    } catch (Exception e1) {
        e1.printStackTrace();
    }
    JPanel chat = new JPanel(new BorderLayout());
    contentjta = new JTextArea(10, 30);
    contentjta.setTabSize(4);
    contentjta.setFont(new Font("楷体", Font.BOLD, 16));
    contentjta.setEditable(false);

    inputjta = new JTextArea(10, 30);
    inputjta.setTabSize(4);
    inputjta.setFont(new Font("楷体", Font.BOLD, 16));
    inputjta.setEditable(true);

    contentscroll = new JScrollPane(contentjta);
    contentscroll
            .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    contentscroll
            .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

    inputscroll = new JScrollPane(inputjta);
    inputscroll
            .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    inputscroll
            .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

    jpanel = new JPanel();
    button = new JButton("发送");
    button.addActionListener(this);

    jpanel.setLayout(new GridLayout(1, 1));
    jpanel.add(button);

    chat.add(contentscroll, BorderLayout.NORTH);
    chat.add(inputscroll, BorderLayout.CENTER);
    chat.add(jpanel, BorderLayout.SOUTH);

    this.setSize(400, 400);
    this.setLocation(400, 200);
    this.setVisible(true);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.add(chat);
}

@Override
public void actionPerformed(ActionEvent e) {
    Object o = e.getSource();
    if (o == button) {
        try {
            Socket so = new Socket("localhost", order);
            OutputStream out = so.getOutputStream();
            PrintStream pout = new PrintStream(out);
            pout.print(inputjta.getText());
            inputjta.setText("");
            out.flush();
            out.close();

        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }
}

}

NUM类
package NewPackage;

public class NUM {
public static int num = 0;
static void numadd(){
num++;
}
}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Java网络编程,多线程,C/S模式

1.会结账的服务器,使用多线程编写一个C/S模式的结账程序。 实验要求如下: a)参照教材例16-6,编写两个类Client.java(包含main方法)和Server.java(包含main方法)。客户端和服务器建立套接字连接后,客户将如下格式的账单发送给服务器: "房租:2189元 水费:112.9元 电费:569元 物业费:832元" 服务器接收客户端所发生的信息,计算总费用,并将总费用返回给客户,返回的信息格式如下: 您的账单: "房租:2189元 水费:112.9元 电费:569元 物业费:832元 总计:3699.9元 b)为服务器编写ServerThread.java线程类。在服务器端,服务器循环监听客户端连接呼叫,与客户端建立连接后,创建并启动ServerThread线程为客户端提供结账服务。 c)使用DataInputStream类作为输入流接收数据(读),使用方法如下: String readUTF(); //读入一个已使用UTF-8修改版格式编码的字符串 d)使用DataOutputStream类作为输出流进行发送数据,使用方法如下: void writeUTF(String str); //以机器无关的的方式用UTF-8修改版将一个字符串写到基本输出流。

异步套接字怎么和多线程搭配?

有谁知道的?cAsyncsocket这个能用多线程吗?ftp两个,控制和连接套接字能放到两个线程吗?求助

java程序编程,多线程输入输出流

实现对多个文件的同时写入操作,并显示操作进度 多线程实现查找磁盘中的临时文件,并进行清理,需要有用户登录界面

一个关于C++多线程socket 套接字的问题

如下博客中的代码是不是缺客户端的代码了,本人是初学者,菜鸟一枚,想要个全的呆猫,麻烦谁提供一下,谢啦 http://blog.csdn.net/chw1989/article/details/7453217

多线程TCP/IP网络编程

编写一个socket通信程序,win32控制台的,可以发送、接收消息和文件。要多线程。C语言的。 客户端和服务端各要有怎样的思路,求指导! --------------------------- 目前思路大致是,服务端,两个子线程,主线程接受连接,一个子线程发送消息,一个子线程接收消息。 客户端,主线程连接,一个子线程发送消息,一个子线程接收消息。 现在有个问题,连接多个客户端后,客户端发送的消息会乱掉,服务器又怎么分辨客户端给特定的客户端发送消息。 还有,怎么传输文件。

求推荐JAVA 多线程编程书籍

求推荐JAVA 多线程编程书籍

两个线程读和写套接字问题

我在socket连接成功后,阻塞的,用pthread创建了两个线程,并把socket传给两个线程,一个线程读,一个线程写,这样会有问题吗?读和写操作的两个线程会不会同时引发error? 伪代码 读取 while(1){ nread = recv(fd, buff, buffSize, 0); if(nread < 0){ error; } do message; } 写 while(1){ buff, buffSize = synchronize(get buff from queue) if (buff == NULL) { continue; } nsend = send(fd, buff, buffSize, 0); if(nsend < 0){ error; } }

socket编程多线程文件传输

要实现的是开多线程传输一个文件,目的是提高传输速度。 思路是这样的:服务端开多线程,将文件分割,一个线程传输一块,客户端也开多线程,每个线程接受一块,最后拼成一个完整的文件。服务端支持多线程, 客户端要支持多线程, 然后客户端每个线程都建立连接到服务端请求一个文件的某个分片。 希望大家可以提供一下类似的代码,现在只有思路不知道怎么下手。

java如何使用Socket实现多线程多人聊天

java如何使用Socket实现多线程多人聊天,提供源码最好了。希望说详细一点。

java接口与多线程的问题

public class ThreadPool { Lock lock = new ReentrantLock();//为什么要用这种形式 ReentrantLock ren=new ReentrantLock();//这样写有什么不一样吗? }

Java编程的多线程,如何实现更好一些?

写了一个网络爬虫程序,每隔10分钟,启动一次爬虫执行。 爬虫程序中,使用了多线程:爬虫程序使用10个线程的多线程,爬取一个指定页面的一些页面数据。 由于每隔10分钟,启动一次爬虫程序,因此,这10个线程就会每10分钟重新生成一次,每天从早晨8:00左右开始,运行了19:30左右时,便就会出现Memroy Overflow的再现。咨询一下大侠,出现如下的错误,有什么好的解决办法? Exception in thread "Thread-690" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOfRange(Unknown Source) at java.lang.String.<init>(Unknown Source) at org.apache.http.util.CharArrayBuffer.toString(CharArrayBuffer.java:461) at org.apache.http.util.EntityUtils.toString(EntityUtils.java:236) at org.apache.http.util.EntityUtils.toString(EntityUtils.java:257) at com.cn.Spilder0721.DownloadBidEntity.getBidEntityFormUrl(DownloadBidEntity.java:102) at com.cn.Spilder0721.BidDataHanding.dataHanding(BidDataHanding.java:23) at com.cn.Spilder0721.BidDataHanding.run(BidDataHanding.java:33)

请问JAVA ODBC编程ResultSet多线程的问题

使用ResultSet取得SQL查询的结果,并对每个next进行处理,写入文件中: File c=new File("E:\\test.txt"); FileWriter x = new FileWriter(c); Statement stat = conn.createStatement(); ResultSet resultSet = stat.executeQuery(sql); String result = ""; while(resultSet.next()) { for (int i = 0; i < 100; i++) { result = result + resultSet.getString(DEF_COLUMN(i)); } x.write(result); } ... 然后觉得速度太慢,想要把字符串处理放到线程中(以下简写) LinkedBlockingQueu<String> queue = new LinkedBlockingQueu<String>(20); thread 1: do { String result = ""; for (int i = 0; i < 100; i++) { result = result + resultSet.getString(DEF_COLUMN(i)); } queue.put(result); }while(resultSet.next()); thread2: do { String result = queue.take(); x.write(result); }while(!queue.isEmpty()); 像上面的形式,当thread1开启一个的时候没有问题。但当开启多个thread1时,resultSet在for循环时不能被其他线程执行next否则报错,没办法只能加锁,这样虽然使用了多线程,但thread1被强制转换成单线程,速度并没有多大提升。所以我想问有没有提升resultSet的fetch速度的好方法。 ps:使用ResultSet localSet = reultSet; 尝试了一下,哈哈,localSet只是resultSet的一个引用,并没有把数据复制到localSet中,localSet.next()的时候另一个线程还是会报错。这种办法不可行。

java socket客户端能不能单线程一次连接服务器然后进行多次对话?

像qq那样,客户端跟服务器都可以发多条消息,我在想客户端能不能通知下服务器自己的输出流有变化

Java httpserver 多线程接收问题

我使用了java 自带的com.sun.net.httpserver,使用多线程接收消息,但是当我在一个线程中加入死循环,客户端第二个请求就接收不到,求大神指点 HttpServerProvider provider = HttpServerProvider.provider(); HttpServer httpserver =provider.createHttpServer(new InetSocketAddress(port), revCount);//监听端口9006,能同时接 受100个请求 httpserver.createContext(context, new HandlerProto()); // httpserver.setExecutor(null); //使用单线程 httpserver.setExecutor(Executors.newCachedThreadPool()); httpserver.start(); public void handle(HttpExchange httpExchange) throws IOException { // TODO Auto-generated method stub String method = httpExchange.getRequestMethod(); if(method.equalsIgnoreCase("GET")){ System.out.println("===>"+Thread.currentThread().getId()); System.out.println("===>"+httpExchange.getRequestURI()); boolean ffff = true; while(ffff){ } byte[] resout = "123".getBytes(); try { httpExchange.sendResponseHeaders(200, resout.length); //设置响应头属性及响应信息的长度 OutputStream out = httpExchange.getResponseBody(); //获得输出流 out.write(resout); out.flush(); out.close(); httpExchange.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

socket编程多线程如何处理客户端不同请求

我现在在服务端想采用多线程处理客户端的连接,发消息,收消息,更新客户列表, 但是我是如何才能知道客户端想要干什么呢? 这个别人的代码 ,他是通过switch判断的,我现在想明白如何实现这个switch过程,控制台程序。 希望大佬回答详细点 ,初如编程很多不明白![图片说明](https://img-ask.csdn.net/upload/201708/01/1501555996_986604.png)

Java写交易客户端(多线程、对象数据传送等简单问题)

有如下几个类: 1、Ticker类 //此Ticker为简单java类,其属性与服务器传来的json字段对应,通过Decoder类反系列化json //反系列化以后的数据,用以做逻辑判断,符合逻辑,则向服务器发出某种请求 public class Ticker implements Serializable { private static final long serialVersionUID = 2015022601L; private volatile Double buy; private volatile Double contractId; public void setBuy(Double buy) { this.buy = buy; } public void setContractId(Double contractId) { this.contractId = contractId; } } public Double getBuy() { return buy; } public BigDecimal getContractId() { return contractId; } public Ticker() { super(); } public Ticker( Double buy, Double contractId) { this.buy = buy; this.contractId = contractId; } } 2、Decoder类 //此类接收服务器传来的json(msg字符串),采用Gson将其反系列化 //此msg消息一直不断推送过来,比如第一次推送{buy:100,contractId:20},下一次可能是{buy:50,contractId:305} public class Decoder implements Abc{ @Override public void onReceive(String msg){ System.out.println(msg); if (msg.contains("ticker")) { Gson gson=new Gson(); Ticker ticker=gson.fromJson(msg, Ticker.class); //反系列化后得到的数据存于ticker对象 } } } 3、Test类 //此类利用反系列化后的数据进行判断,然后向服务器发出某些请求 public class Test{ 此类里需要用到Decoder里得到的ticker对象的buy及contractId属性值, 比如此类一直在做以下判断 if (buy>contractId){ 向服务器发出一次请求 } } 问题: (1),Test类怎么才能得到Decoder类里实例化的ticker对象的属性值(buy,contractId),是在Ticker加上一个构造方法?还是在Decoder类里写一个方法?或者其他?请给出实际代码。 (付:这是一个线程间通讯的问题么?) (2),Decoder类一直每秒几次的转换服务器推送来的json,每一次得到的ticker对象地址不一样,其ticker只有最近一个的属性有用,这样是不是产生了大量的垃圾,还是说虽然地址不一样,但后产生的ticker自动覆盖了前面的ticker对象? (3),如果此程序采用多线程,同时还使用SWT写了一个UI类,是否要再写一个类用来更新ticker对象的属性到UI界面上(或者采用Eclipse数据绑定的办法)? 现在相当于: Decoder类一直不断在进行json转换, UI类一直在把ticker对象的属性数据更新到UI界面(或者用其他办法更新上去), Test类也一直在使用ticker的属性值进行数据的逻辑判断, 此程序是否应该是至少三个线程?那具体怎么实现多线程(每个类都实现Runnable接口?)?主方法是该放在UI类里,还是放在客服端里(Test类是否可作为客服端)? 请请给出具体多线程实现的代码? (4)如果Test类用于逻辑判断的属性值buy和contractId不采用Decoder类里产生的,而是去UI界面上再次取得,那这个取得过程是否与(2)问的解决办法一样? 真心求教,成功发财了发个大红包!

Java多线程服务器问题,executorservice的用法

创建了一个Java多线程服务器,通过socket连接不断接收大量设备(客户端)传输过来的信息 ``` // 创建可以容纳4个线程的线程池 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4); ``` 当连接数达到4个时出现了阻塞状态,求解怎么解决,怎么在完成一次数据解析后释放工作线程接收下一个连接,有点卡壳

使用Java socket让客户端与服务器建立连接后,服务器如何判断来自客户端的各类请求

初学java,目前写了一个服务端和一个客户端。大致了解了如何socket通信是如何操作的,并且初步实现了客户端和服务端的通信。也仅仅是是接受和返回简单的字符串。部分代码如下 public void run(){ try{ serverSocket=new ServerSocket(SERVER_PORT_ONE); System.out.println("serversocket已创建"); while(true){ clientSocket=serverSocket.accept(); System.out.println("监测到了socket"); receiveThread=new SocketThread(clientSocket); //开启新线程处理请求 receiveThread.start(); } }catch(IOException e){ System.out.println(e.getMessage()); } } ``` ``` 这是socket监听的代码。当服务器监听到了socket之后,开启一个新线程去处理。 socketthread类的run()方法来接受数据 public void run(){ String Command=null; String str=null; output.println("服务器已经接受你的连接\n"); while(true){ try{ str=null; str=input.readLine(); System.out.println("监测数据如下:"+str); }catch(IOException e){ System.out.println(e.getMessage()); } Command=str.trim().toUpperCase(); if(str==null || Command.equals("QUIT")) { break; } } try{ clientSocket.close();//关闭套接字 System.out.println("clientSocket已经断开连接"); }catch(IOException e){ System.out.println(e.getMessage()); } Command=null; } ``` 在while循环里面,服务端会不断读取来自客户端的内容,然后输出来。如果读到quit,就表示断开连接,并关闭socket。 ``` 现在的问题就是, 如果我的客户端的请求十分多样,比如发送语音,视频,图片或者数据给服务器进行处理,我的服务端必须做出相应的处理,请问如何做到这点啊。 我自己想的思路是客户端发送数据前先要发送一个header标签,表示想干什么。然后读取到了之后客户端再判断,然后分给不同的函数去处理。不知道这样好不好,如下所示。 while(true){ try{ str=null; str=input.readLine(); if(str.equals("图片")){ 图片相关函数(socket ); } if(str.equals("视频")){ 视频处理相关函数(socket ); } if(str.equals("数据")){ 数据处理相关函数(socket );//如各种算法 } System.out.println("监测数据如下:"+str); }catch(IOException e){ System.out.println(e.getMessage()); } Command=str.trim().toUpperCase(); if(str==null || Command.equals("QUIT")) { break; } 不知道是否可行。 第二个问题,我的服务器要主动推送数据给客户端该如何实现,肯定不能写在这个线程里面。写在其他地方我的类和函数如何得到这个线程里的socket呢。

初次写JAVA 使用Socket的多线程的多人聊天出现服务端不能接收。

用gui+socket写的,已实现服务端可以发送信息给客户端,客户端可以接收信息, 但客户端发给服务端却不能接收。只用了输入、输出流,没用多线程先。 刚学,没有写过,有很多不懂,希望有人能帮我看看出了什么错,谢谢! 类Server package tcp_udp; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; import java.net.ServerSocket; import java.net.Socket; import javax.swing.*; public class Server extends JFrame{ static JTextArea w; static JTextArea send1; static String t1;//发送框里的内容 Server() { setTitle("服务器"); w=new JTextArea(); JButton send2=new JButton("发送"); send1=new JTextArea(3,8); JPanel s1=new JPanel(); send2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub // Server.t1=send1.getText(); socket.prin(send1.getText()); }}); add(w,"Center"); s1.add(send1); s1.add(send2); add(s1,"South"); setVisible(true); setSize(300,300); setLocationRelativeTo(null);//窗口居中 } public static void main(String[] args) { // TODO Auto-generated method stub new Server(); socket q2=new socket(); q2.start(); } } class socket extends Thread { ServerSocket s; Socket s1; static PrintStream p1; BufferedReader in; static String L2; socket(){ try { s=new ServerSocket(9984); System.out.println("服务器开启:"); while(true) { s1=s.accept(); p1=new PrintStream(s1.getOutputStream()); in=new BufferedReader(new InputStreamReader(s1.getInputStream())); L2=in.readLine(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void run()//接收 { // String L2=in.readLine(); if(L2!=null&&L2.trim()!="") {String n="[客户:]"; new Add2(n,L2); } } static void prin( String t)//发送 {String n=""; p1.println(t); new Add2(n,t); }} class Add2//将发送或接收的信息显示在文本框 { Add2(String n,String L1) { Server.w.append(n+L1+"\n"); }} 类Cilent package tcp_udp; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; import java.net.Socket; import javax.swing.*; public class Cilent extends JFrame{ static JTextArea w; static JTextArea send2; Cilent() { setTitle("客户"); w=new JTextArea(); JButton send=new JButton("发送"); send2=new JTextArea(3,8); JPanel s1=new JPanel(); send.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub Socket1.prin(send2.getText()); }}); add(w,"Center"); s1.add(send2); s1.add(send); add(s1,"South"); setVisible(true); setSize(300,300); setLocationRelativeTo(null);//窗口居中 } public static void main(String[] args) { // TODO Auto-generated method stub new Cilent(); Socket1 q1=new Socket1(); q1.start(); }} class Add1//将发送或接收的信息显示在文本框 { Add1(String n,String L1) { Cilent.w.append(n+L1+"\n"); } } class Socket1 extends Thread { static BufferedReader in1; static PrintStream out; static String L1; Socket1(){ try { Socket ss1=new Socket("127.0.0.1",9984); in1=new BufferedReader(new InputStreamReader(ss1.getInputStream())); out=new PrintStream(ss1.getOutputStream()); L1=in1.readLine(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } static void prin( String t)//发送 {String n=""; out.println(t); System.out.print(t+"hhah"); new Add1(n,t); } public void run()//接收 { if(L1!=null&&L1.trim() != "") {String n="[服务器:]"; new Add1(n,Socket1.L1); } } }

linux下利用/proc进行进程树的打印

在linux下利用c语言实现的进程树的打印,主要通过/proc下的目录中的进程文件,获取status中的进程信息内容,然后利用递归实现进程树的打印

设计模式(JAVA语言实现)--20种设计模式附带源码

课程亮点: 课程培训详细的笔记以及实例代码,让学员开始掌握设计模式知识点 课程内容: 工厂模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式、原型模型、代理模式、单例模式、适配器模式 策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式 课程特色: 笔记设计模式,用笔记串连所有知识点,让学员从一点一滴积累,学习过程无压力 笔记标题采用关键字标识法,帮助学员更加容易记住知识点 笔记以超链接形式让知识点关联起来,形式知识体系 采用先概念后实例再应用方式,知识点深入浅出 提供授课内容笔记作为课后复习以及工作备查工具 部分图表(电脑PC端查看):

Python数据分析与挖掘

92讲视频课+16大项目实战+源码+¥800元课程礼包+讲师社群1V1答疑+社群闭门分享会=99元 &nbsp; 为什么学习数据分析? &nbsp; &nbsp; &nbsp; 人工智能、大数据时代有什么技能是可以运用在各种行业的?数据分析就是。 &nbsp; &nbsp; &nbsp; 从海量数据中获得别人看不见的信息,创业者可以通过数据分析来优化产品,营销人员可以通过数据分析改进营销策略,产品经理可以通过数据分析洞察用户习惯,金融从业者可以通过数据分析规避投资风险,程序员可以通过数据分析进一步挖掘出数据价值,它和编程一样,本质上也是一个工具,通过数据来对现实事物进行分析和识别的能力。不管你从事什么行业,掌握了数据分析能力,往往在其岗位上更有竞争力。 &nbsp;&nbsp; 本课程共包含五大模块: 一、先导篇: 通过分析数据分析师的一天,让学员了解全面了解成为一个数据分析师的所有必修功法,对数据分析师不在迷惑。 &nbsp; 二、基础篇: 围绕Python基础语法介绍、数据预处理、数据可视化以及数据分析与挖掘......这些核心技能模块展开,帮助你快速而全面的掌握和了解成为一个数据分析师的所有必修功法。 &nbsp; 三、数据采集篇: 通过网络爬虫实战解决数据分析的必经之路:数据从何来的问题,讲解常见的爬虫套路并利用三大实战帮助学员扎实数据采集能力,避免没有数据可分析的尴尬。 &nbsp; 四、分析工具篇: 讲解数据分析避不开的科学计算库Numpy、数据分析工具Pandas及常见可视化工具Matplotlib。 &nbsp; 五、算法篇: 算法是数据分析的精华,课程精选10大算法,包括分类、聚类、预测3大类型,每个算法都从原理和案例两个角度学习,让你不仅能用起来,了解原理,还能知道为什么这么做。

广工操作系统课程设计(文档+代码+可执行文件)

实现作业调度(先来先服务)、进程调度功能(时间片轮转) 实现内存管理功能(连续分配)。 实现文件系统功能(选作) 这些功能要有机地连接起来

Only老K说-爬取妹子图片(简单入门)

安装第三方请求库 requests 被网站禁止了访问 原因是我们是Python过来的 重新给一段 可能还是存在用不了,使用网页的 编写代码 上面注意看匹配内容 User-Agent:请求对象 AppleWebKit:请求内核 Chrome浏览器 //请求网页 import requests import re //正则表达式 就是去不规则的网页里面提取有规律的信息 headers = { 'User-Agent':'存放浏览器里面的' } response = requests.get

linux“开发工具三剑客”速成攻略

工欲善其事,必先利其器。Vim+Git+Makefile是Linux环境下嵌入式开发常用的工具。本专题主要面向初次接触Linux的新手,熟练掌握工作中常用的工具,在以后的学习和工作中提高效率。

Python代码实现飞机大战

文章目录经典飞机大战一.游戏设定二.我方飞机三.敌方飞机四.发射子弹五.发放补给包六.主模块 经典飞机大战 源代码以及素材资料(图片,音频)可从下面的github中下载: 飞机大战源代码以及素材资料github项目地址链接 ————————————————————————————————————————————————————————— 不知道大家有没有打过飞机,喜不喜欢打飞机。当我第一次接触这个东西的时候,我的内心是被震撼到的。第一次接触打飞机的时候作者本人是身心愉悦的,因为周边的朋友都在打飞机, 每

Python数据清洗实战入门

本次课程主要以真实的电商数据为基础,通过Python详细的介绍了数据分析中的数据清洗阶段各种技巧和方法。

2019 Python开发者日-培训

本次活动将秉承“只讲技术,拒绝空谈”的理念,邀请十余位身处一线的Python技术专家,重点围绕Web开发、自动化运维、数据分析、人工智能等技术模块,分享真实生产环境中使用Python应对IT挑战的真知灼见。此外,针对不同层次的开发者,大会还安排了深度培训实操环节,为开发者们带来更多深度实战的机会。

apache-jmeter-5.1.1(Requires Java 8+).zip

。Apache JMeter 5.1.1 (Requires Java 8+),需要jdk8以上的版本。

数通HCNP中文理论全套教材.rar

内涵HCNP-IENP中文理论书-内文,

Python可以这样学(第四季:数据分析与科学计算可视化)

董付国老师系列教材《Python程序设计(第2版)》(ISBN:9787302436515)、《Python可以这样学》(ISBN:9787302456469)配套视频,在教材基础上又增加了大量内容,通过实例讲解numpy、scipy、pandas、statistics、matplotlib等标准库和扩展库用法。

Java基础知识面试题(2020最新版)

文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类有何不同?Java应用程序与小程序之间有那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的对比基础语法数据类型Java有哪些数据类型switc...

我以为我对Mysql事务很熟,直到我遇到了阿里面试官

太惨了,面试又被吊打

2019 AI开发者大会

2019 AI开发者大会(AI ProCon 2019)是由中国IT社区CSDN主办的AI技术与产业年度盛会。多年经验淬炼,如今蓄势待发:2019年9月6-7日,大会将有近百位中美顶尖AI专家、知名企业代表以及千余名AI开发者齐聚北京,进行技术解读和产业论证。我们不空谈口号,只谈技术,诚挚邀请AI业内人士一起共铸人工智能新篇章!

图书管理系统(Java + Mysql)我的第一个完全自己做的实训项目

图书管理系统 Java + MySQL 完整实训代码,MVC三层架构组织,包含所有用到的图片资源以及数据库文件,大三上学期实训,注释很详细,按照阿里巴巴Java编程规范编写

Python数据挖掘简易入门

&nbsp; &nbsp; &nbsp; &nbsp; 本课程为Python数据挖掘方向的入门课程,课程主要以真实数据为基础,详细介绍数据挖掘入门的流程和使用Python实现pandas与numpy在数据挖掘方向的运用,并深入学习如何运用scikit-learn调用常用的数据挖掘算法解决数据挖掘问题,为进一步深入学习数据挖掘打下扎实的基础。

C/C++学习指南全套教程

C/C++学习的全套教程,从基本语法,基本原理,到界面开发、网络开发、Linux开发、安全算法,应用尽用。由毕业于清华大学的业内人士执课,为C/C++编程爱好者的教程。

微信公众平台开发入门

本套课程的设计完全是为初学者量身打造,课程内容由浅入深,课程讲解通俗易懂,代码实现简洁清晰。通过本课程的学习,学员能够入门微信公众平台开发,能够胜任企业级的订阅号、服务号、企业号的应用开发工作。 通过本课程的学习,学员能够对微信公众平台有一个清晰的、系统性的认识。例如,公众号是什么,它有什么特点,它能做什么,怎么开发公众号。 其次,通过本课程的学习,学员能够掌握微信公众平台开发的方法、技术和应用实现。例如,开发者文档怎么看,开发环境怎么搭建,基本的消息交互如何实现,常用的方法技巧有哪些,真实应用怎么开发。

三个项目玩转深度学习(附1G源码)

从事大数据与人工智能开发与实践约十年,钱老师亲自见证了大数据行业的发展与人工智能的从冷到热。事实证明,计算机技术的发展,算力突破,海量数据,机器人技术等,开启了第四次工业革命的序章。深度学习图像分类一直是人工智能的经典任务,是智慧零售、安防、无人驾驶等机器视觉应用领域的核心技术之一,掌握图像分类技术是机器视觉学习的重中之重。针对现有线上学习的特点与实际需求,我们开发了人工智能案例实战系列课程。打造:以项目案例实践为驱动的课程学习方式,覆盖了智能零售,智慧交通等常见领域,通过基础学习、项目案例实践、社群答疑,三维立体的方式,打造最好的学习效果。

2021考研数学张宇基础30讲.pdf

张宇:博士,全国著名考研数学辅导专家,教育部“国家精品课程建设骨干教师”,全国畅销书《张宇高等数学18讲》《张宇线性代数9讲》《张宇概率论与数理统计9讲》《张宇考研数学题源探析经典1000题》《张宇考

专为程序员设计的数学课

<p> 限时福利限时福利,<span>15000+程序员的选择!</span> </p> <p> 购课后添加学习助手(微信号:csdn590),按提示消息领取编程大礼包!并获取讲师答疑服务! </p> <p> <br> </p> <p> 套餐中一共包含5门程序员必学的数学课程(共47讲) </p> <p> 课程1:《零基础入门微积分》 </p> <p> 课程2:《数理统计与概率论》 </p> <p> 课程3:《代码学习线性代数》 </p> <p> 课程4:《数据处理的最优化》 </p> <p> 课程5:《马尔可夫随机过程》 </p> <p> <br> </p> <p> 哪些人适合学习这门课程? </p> <p> 1)大学生,平时只学习了数学理论,并未接触如何应用数学解决编程问题; </p> <p> 2)对算法、数据结构掌握程度薄弱的人,数学可以让你更好的理解算法、数据结构原理及应用; </p> <p> 3)看不懂大牛代码设计思想的人,因为所有的程序设计底层逻辑都是数学; </p> <p> 4)想学习新技术,如:人工智能、机器学习、深度学习等,这门课程是你的必修课程; </p> <p> 5)想修炼更好的编程内功,在遇到问题时可以灵活的应用数学思维解决问题。 </p> <p> <br> </p> <p> 在这门「专为程序员设计的数学课」系列课中,我们保证你能收获到这些:<br> <br> <span> </span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">①价值300元编程课程大礼包</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">②应用数学优化代码的实操方法</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">③数学理论在编程实战中的应用</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">④程序员必学的5大数学知识</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">⑤人工智能领域必修数学课</span> </p> <p> <br> 备注:此课程只讲程序员所需要的数学,即使你数学基础薄弱,也能听懂,只需要初中的数学知识就足矣。<br> <br> 如何听课? </p> <p> 1、登录CSDN学院 APP 在我的课程中进行学习; </p> <p> 2、登录CSDN学院官网。 </p> <p> <br> </p> <p> 购课后如何领取免费赠送的编程大礼包和加入答疑群? </p> <p> 购课后,添加助教微信:<span> csdn590</span>,按提示领取编程大礼包,或观看付费视频的第一节内容扫码进群答疑交流! </p> <p> <img src="https://img-bss.csdn.net/201912251155398753.jpg" alt=""> </p>

DDR5_Draft_Spec_Rev05c.pdf

DDR5 spec

Java面试史上最全的JAVA专业术语面试100问 (前1-50)

前言: 说在前面, 面试题是根据一些朋友去面试提供的,再就是从网上整理了一些。 先更新50道,下一波吧后面的也更出来。 求赞求关注!! 废话也不多说,现在就来看看有哪些面试题 1、面向对象的特点有哪些? 抽象、继承、封装、多态。 2、接口和抽象类有什么联系和区别? 3、重载和重写有什么区别? 4、java有哪些基本数据类型? 5、数组有没有length()方法?String有没有length()方法? 数组没有length()方法,它有length属性。 String有length()方法。 集合求长度用

网络工程师小白入门--【思科CCNA、华为HCNA等网络工程师认证】

本课程适合CCNA或HCNA网络小白同志,高手请绕道,可以直接学习进价课程。通过本预科课程的学习,为学习网络工程师、思科CCNA、华为HCNA这些认证打下坚实的基础! 重要!思科认证2020年2月24日起,已启用新版认证和考试,包括题库都会更新,由于疫情原因,请关注官网和本地考点信息。题库网络上很容易下载到。

C/C++跨平台研发从基础到高阶实战系列套餐

一 专题从基础的C语言核心到c++ 和stl完成基础强化; 二 再到数据结构,设计模式完成专业计算机技能强化; 三 通过跨平台网络编程,linux编程,qt界面编程,mfc编程,windows编程,c++与lua联合编程来完成应用强化 四 最后通过基于ffmpeg的音视频播放器,直播推流,屏幕录像,

Python界面版学生管理系统

前不久上传了一个控制台版本的学生管理系统,这个是Python界面版学生管理系统,这个是使用pycharm开发的一个有界面的学生管理系统,基本的增删改查,里面又演示视频和完整代码,有需要的伙伴可以自行下

2019数学建模A题高压油管的压力控制 省一论文即代码

2019数学建模A题高压油管的压力控制省一完整论文即详细C++和Matlab代码,希望对同学们有所帮助

4小时玩转微信小程序——基础入门与微信支付实战

这是一个门针对零基础学员学习微信小程序开发的视频教学课程。课程采用腾讯官方文档作为教程的唯一技术资料来源。杜绝网络上质量良莠不齐的资料给学员学习带来的障碍。 视频课程按照开发工具的下载、安装、使用、程序结构、视图层、逻辑层、微信小程序等几个部分组织课程,详细讲解整个小程序的开发过程

相关热词 c# 不能序列化继承类 c# char* 调用 c# 开发dll模板 c#添加控件到工具箱 c#控制台组合数 编程计算猴子吃桃问题c# c# wpf 背景透明 随机抽取号码软件c# c# 开发环境 c# 属性和字段
立即提问