java socket通讯 一个服务器连接多个客户端 如何在服务器端给指定的客户端主动发送消息?

java socket通讯 一个服务器连接多个客户端 如何在服务器端给指定的客户端主动发送消息? 新人小白求大神帮帮忙 最好附上代码 真的很急啊

2个回答

/*所有的聊天室用户*/记录登录的用户
private List safeList;
while(true){
//1.接收当前客户端发送来的消息
String currWords= buffReader.readLine();
System.out.println("currWords="+currWords);
//2.服务器(就是"聊天室管理员"的角色)
for(Socket s:safeList){

                //不转发给自己
                if(s.equals(soc)){
                    continue;
                }
                PrintWriter printWriter=new PrintWriter(new OutputStreamWriter(s.getOutputStream(),"utf-8"),true);

                printWriter.println(soc.getInetAddress().getHostAddress()+"说:"+currWords);
                printWriter.flush();
            }
            根据socket来判断发送给哪个用户,希望对你有帮助

长连接
websocket
mina

我也想知道更多,mark等回

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java socket客户端往服务器端发送文件
java socket客户端往服务器端发送文件包括二进制文件word文件, 请问文件传输的通讯协议该如何定义,不知道怎么自定义通讯协议。 我所说的发送文件是指多个文件,不是简单的一个文件。我想要的是自定义协议,客户端与 服务器端通讯的协议。
socket服务器多网卡监听INADDR_ANY,一个客户端跟其中一块网卡同网段,有时连接不成功
我用笔记本建一个socket服务器,笔记本的有线网卡地址是192.168.127.2,再用笔记本发wifi,wifi网卡地址是192.168.137.1,然后监听ServerAddress.sin_addr.s_addr = htonl(INADDR_ANY);我用eclipse开Android虚拟机用socket连接192.168.137.1这个地址是成功的,但是把apk装到我手机,手机连接上笔记本发出的wifi,手机wifi地址是192.168.137.125,这个apk在手机上运行时连接服务器有时可以成功有时不可以成功,试过用c++和java写的socket服务器都是这样,有没有可能是手机连接服务器时把连接信息发到了服务器的另一张不同网段的网卡?导致连接接收不到返回,然后超时?请教各位。。
Java中的Socket服务中如何实现客户端和服务端多次通讯
比如,服务器给客户端发一个信息。然后服务端根据客户端发送的信息判断,再回复一个信息,就是多次读和写的问题
java 简单的服务器端与多客户端通信异常的问题
# 服务器端代码 package service; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; import java.util.zip.InflaterInputStream; public class Server { public static void main(String[] args) { // TODO Auto-generated method stub ServerSocket ss = null; try { System.out.println("服务器已启动,等待客户端连接。。。"); ss = new ServerSocket(8888); while (true) { Socket s = ss.accept(); new serverthread(s).start(); s.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } class serverthread extends Thread { Socket s = null; String str; public serverthread(Socket socket) { super(); this.s = socket; System.out.println("一个客户端已经连接上"); } PrintStream out=null; BufferedReader in =null; @Override public void run() { // TODO Auto-generated method stub try { System.out.println(s.getLocalPort()); out=new PrintStream(s.getOutputStream(), true); in=new BufferedReader(new InputStreamReader(s.getInputStream()));//获取客户端套接字输入输出流 str=in.readLine(); System.out.println("客户端用户名"+str); if (str.equals("JSIT")) { out.println("用户名正确"); }else out.println("用户名不存在"); } catch (IOException e) { // TODO Auto-generated catch block } } } # 客户端代码 package client; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; import java.net.UnknownHostException; public class Clint2 { public static void main(String[] args) { // TODO Auto-generated method stub try { Socket s=new Socket("127.0.0.1", 8888); PrintStream out=new PrintStream(s.getOutputStream()); BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream())); BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in)); System.out.print("用户名:"); String str=stdin.readLine(); out.println(str); System.out.println(in.readLine()); in.close(); out.close(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 我先运行了服务端,再运行客户端时会报socket is closed的异常,是什么原因?
netty-socket-io瞬间连接量太大
基于netty的socket-io的方式做一个客户端和服务端实时通讯的功能,当我们的系统重新部署之后,原先保持的连接肯定都断开-->重新连接服务端,那么服务端肯定有收到大量的连接请求,服务端又刚刚启动;所以有以下两个问题: 1.socket-io 基于普通的服务器最多能连接多少? 2.socket-io针对服务部署后客户端瞬时大量重新连接应该怎么处理? 3.有神没有什么预热的方式,缓解系统的一部分压力,防止系统宕机崩溃? 希望各位能够帮忙。
java socket编程中,怎样能传递socket对象?
大概是这样的,多个客户端可以连接到同一个服务器,客户端之间也可相互通信,但是先要借助服务器把相互通信的2个客户端的socket对象分别传给对方。有没有什么方法可以传递socket对象呢?
java及时通讯,java网络编程方面的知识!
才学JAVA一年多时间~~原来一直对J2EE比较感兴趣!!最近想做一个仿QQ的程序!用到了java网络编程,和j2se的swing,很多地方都不是很明白,毕竟刚开始学这方面的知识,其实就是一个菜鸟了,现在需要的是一个服务器,和若干个客户端~ 大概思路是: 当客户端登陆服务器时候,服务器就是开始验证并且把客户端的IP和端口存入数据库,然后客户端之间相互通讯的时候可以不用经过服务器端!而是两个客户端直接通讯,每一个客户端当它们登陆到服务器上的时候会获取到其它客户端的IP和端口,然后通讯,我就卡在这个地方了,两个客户端到底是怎么通讯的?服务器端一般就是ServerSocket,客户端一般就是Socket啊?就算客户端知道对方ip这个问题,那客户端是怎么通过Socket建立通讯的,知道的朋友帮忙给分析一下,谢谢了!
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<Socket> solist = new ArrayList<Socket>(); public static ArrayList<MyClient> ctlist = new ArrayList<MyClient>(); 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(); } } } }
服务器端accept访问阻塞,导致两个客户端无法同时访问服务器
package server; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args){ ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(8888); System.out.println("服务器端准备就绪"); while(true){ Socket recieve = serverSocket.accept(); ThreadInServer TS = new ThreadInServer(recieve); TS.start(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 其中ThreadInServer是新开的线程,用来进行文件传输 当两个客户端同时访问时,会显示“正在等待可用的套接字” 如果我想两个及以上客户端同时访问这个服务器,这里的代码如何改进?
服务端监控多个客户端进程是否僵死,具体怎么实现?
有多个已上线的系统,部署在不同的服务器上,现在要开发一个监控系统,用来监控这些系统的运行状态,其中一项是进程是否僵死的监控,想通过socket心跳包的形式来实现。开发语言用的是java。 我的思路是: 给每个客户端设置一个唯一的AppNode,客户端每隔一段时间按照规定协议发送对应的 xml心跳包给服务端。 服务端接收各个客户端发送过来的心跳包,如果超过一定时间收不到某个客户端的心跳包,则记录一条异常信息到日志表里,然后发短信通知相关人员去处理。 服务器端具体怎么做,我思路还不是很清楚,有做过类似功能的吗,想请教一下。
Java多线程服务器问题,executorservice的用法
创建了一个Java多线程服务器,通过socket连接不断接收大量设备(客户端)传输过来的信息 ``` // 创建可以容纳4个线程的线程池 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4); ``` 当连接数达到4个时出现了阻塞状态,求解怎么解决,怎么在完成一次数据解析后释放工作线程接收下一个连接,有点卡壳
两个java通讯程序问题
1、假设有一个客户端通过Socket连接上某个服务器,该Socket的输出流被多个线程同时共享,并同时输出若干数据,每个线程各自输出5个相同的字符串,每个线程输出的内容不同,例如线程1输出“AAAAA”,线程2输出“BBBBB”,线程3输出“CCCCC”。 服务器端接收客户端的请求数据并打印,请问服务器端接收到的数据是否都是 AAAAA,BBBBB,CCCCC这样的,还是ABCAA这样的混乱型的 2、如果一个mina做的服务端 连接了多个客户端 客户端1正在输入 10K数据的同时 其他客户端能否传输数据
Java的客户端与服务器,客户端可以发信息,想加一个让服务器也能发信息?
```客户端代码: package Other; import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.PrintWriter; import java.io.Writer; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketAddress; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; public class Server extends JFrame { private JPanel p1, p2, p4, p5, p6; private JLabel lb1, lb2, lb3, lb4; private Container container; private JTextField t1, t2; private static JTextArea ta; private JButton bt; public Server() { this.setTitle("服务器"); container = this.getContentPane(); container.setLayout(new FlowLayout(FlowLayout.LEFT)); lb1 = new JLabel("服务器启动面板"); lb2 = new JLabel("服务器主机名:"); lb3 = new JLabel("服务器端口:"); lb4 = new JLabel("服务器收到客户机消息面板"); bt = new JButton("启动服务器"); bt.addActionListener(new btActionListener()); t1 = new JTextField(10); t2 = new JTextField(5); ta = new JTextArea(15, 40); // ta.addActionListener(new taActionListener()); p1 = new JPanel(); p2 = new JPanel(); p4 = new JPanel(); p5 = new JPanel(); p6 = new JPanel(); p1.add(lb1); container.add(p1); p2.add(lb2); p2.add(t1); p2.add(lb3); p2.add(t2); p2.add(bt); container.add(p2); p4.add(lb4); container.add(p4); p5.add(ta); p6.add(p5); container.add(p6); this.setSize(500, 500); this.setVisible(true); this.setResizable(false); } private ServerSocket listenSocket =null; private Socket toClientSocket = null; private BufferedReader in; private PrintWriter out; public static int clientCounts = 0; public class taActionListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { } } public class btActionListener implements ActionListener { public void actionPerformed(ActionEvent arg0) { try { bt.setEnabled(false); String hostName = t1.getText(); int hostPort = Integer.parseInt(t2.getText()); SocketAddress serverAddr = new InetSocketAddress( InetAddress.getByName(hostName),hostPort); listenSocket = new ServerSocket(); listenSocket.bind(serverAddr); ta.append("服务器开始等待客户机连接…\n"); } catch (Exception e) {} //创建匿名线程,创建响应客户机的会话线程 new Thread(new Runnable() { @Override public void run() { try { while (true) { // 处理客户机连接 toClientSocket = listenSocket.accept(); // 侦听并接受客户机连接 clientCounts++; ta.append(toClientSocket.getRemoteSocketAddress() + "客户机编号" + clientCounts + "会话开始…\n"); // 创建客户线程clientThread,实现一客户一线程 Thread clientThread = new ClientThread(toClientSocket, clientCounts); clientThread.start(); }//end while } catch (IOException e) { JOptionPane.showMessageDialog(null, e.getMessage(), "错误提示", JOptionPane.ERROR_MESSAGE); return; } }//end run() }).start(); } } private void formWindowClosing (java.awt.event.WindowEvent evt){ try { if(in != null)in.close(); if(out != null)out.close(); if (listenSocket != null)listenSocket.close(); if (toClientSocket != null)toClientSocket.close(); } catch (Exception e) {} } public static void main(String[] args) { new Server(); } public static JTextArea getScreen() { return ta; } } 服务器代码: package Other; import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; public class Client extends JFrame { private JPanel p1, p2, p3, p5, p6, p7; private JLabel lb1, lb2, lb3, lb4, lb5; private Container container; private JTextField t1, t2, t3; private static JTextArea ta; private JButton bt1, bt2; public Client(){ this.setTitle("客户机"); container = this.getContentPane(); container.setLayout(new FlowLayout(FlowLayout.LEFT)); lb1 = new JLabel("通信面板"); lb2 = new JLabel("服务器主机名:"); lb3 = new JLabel("服务器端口:"); lb4 = new JLabel("待发送消息:"); lb5 = new JLabel("服务器Echo消息面板"); bt1 = new JButton("连接服务器"); bt2 = new JButton(" 发 言 "); bt1.addActionListener(new bt1ActionListener()); bt2.addActionListener(new bt2ActionListener()); t1 = new JTextField(10); t2 = new JTextField(5); t3 = new JTextField(25); ta = new JTextArea(15, 40); p1 = new JPanel(); p2 = new JPanel(); p3 = new JPanel(); p5 = new JPanel(); p6 = new JPanel(); p7 = new JPanel(); p1.add(lb1); container.add(p1); p2.add(lb2); p2.add(t1); p2.add(lb3); p2.add(t2); p2.add(bt1); container.add(p2); p3.add(lb4); p3.add(t3); p3.add(bt2); container.add(p3); p5.add(lb5); container.add(p5); p6.add(ta); p7.add(p6); container.add(p7); this.setSize(500, 500); this.setVisible(true); this.setResizable(false); } private Socket clientSocket = null; private BufferedReader in; private PrintWriter out; public class bt1ActionListener implements ActionListener { public void actionPerformed(ActionEvent arg0) { try { bt1.setEnabled(false); String remoteName = t1.getText(); int remotePort = Integer.parseInt(t2.getText()); SocketAddress remoteAddr = new InetSocketAddress( InetAddress.getByName(remoteName),remotePort); clientSocket = new Socket(); clientSocket.connect(remoteAddr); ta.append("连接服务器成功,会话开始…\n"); out = new PrintWriter(new OutputStreamWriter( clientSocket.getOutputStream(),"UTF-8"),true); in = new BufferedReader(new InputStreamReader( clientSocket.getInputStream(),"UTF-8")); } catch (Exception e) { JOptionPane.showConfirmDialog(null, e.getMessage(), "连接错误",JOptionPane.ERROR_MESSAGE); return; } } } public class bt2ActionListener implements ActionListener { public void actionPerformed(ActionEvent arg0) { if(clientSocket == null){ JOptionPane.showMessageDialog(null, "请先检查服务器连接情况。\n确保客户及连接服务器!", "错误提示", JOptionPane.ERROR_MESSAGE); return; } String outStr = t3.getText(); if(outStr.length() == 0){ JOptionPane.showMessageDialog(null, "请输入发送消息!", "提示", JOptionPane.ERROR_MESSAGE); return; } out.println(outStr); t3.setText(""); try { String inStr; inStr = in.readLine(); ta.append("Echo:" + inStr + "\n"); } catch (Exception e) { JOptionPane.showMessageDialog(null, "客户机接收消息错误!", "错误提示", JOptionPane.ERROR_MESSAGE); return; } } } private void formWindowClosing(java.awt.event.WindowEvent evt){ try { if(in != null)in.close(); if(out != null)out.close(); if(clientSocket != null)clientSocket.close(); } catch (Exception e) {} } public static void main(String[] args) { new Client(); } } 多线程: package Other; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; public class ClientThread extends Thread { private Socket toClientSocket = null; private BufferedReader in; private PrintWriter out; public static int clientCounts = 0; public ClientThread(Socket toClientSocket,int clientCounts){ this.toClientSocket = toClientSocket; this.clientCounts = clientCounts; } @Override public void run() { try { in = new BufferedReader( new InputStreamReader(toClientSocket.getInputStream(),"UTF-8")); out = new PrintWriter( new OutputStreamWriter(toClientSocket.getOutputStream(),"UTF-8"),true); //根据服务器协议,在网络流上进行读写操作 String recvStr; while((recvStr = in.readLine()) != null){ //客户机关闭,反复等待 System.out.println(recvStr); Date date = new Date(); //和接受客户机消息 DateFormat format = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss"); String time = format.format(date); //解析并显示收到的信息 Server.getScreen().append(toClientSocket.getRemoteSocketAddress() + "客户机编号:" + clientCounts + "消息:" + recvStr + ":" + time + "\n"); //按照Echo协议原封不动会送消息 out.println(toClientSocket.getLocalAddress() + "客户机编号:" + clientCounts + "Echo消息:" + recvStr + ":" + time); }//end while Server.clientCounts--; //远程客户机断开,释放资源 if(in != null)in.close(); if(out != null)out.close(); if (toClientSocket != null)toClientSocket.close(); } catch (Exception e) {} }//end run }//end class
Java swing多线程实现聊天程序阻塞问题
1、在用swing写一个能够动态添加客户端的socket通信程序,即服务端用 一个异步线程持续监听新的客户端连接,如果有新的连接就新建一个客户端线 程来监听客户端,接收或者发送给客户端信息。 ```java //这是监听客户端连接的线程: new Thread(new Runnable() { @Override public void run() { // 异步线程持续监听端口连接 while (true){ if (server.isClosed()){ // 服务器一旦关闭,就跳出循环 break; } Socket temp = null; try { temp = server.accept(); JOptionPane.showMessageDialog(null,"连接建立成功,客户端端口号为:" +temp.getPort()); // 为每一个连接建立一个异步线程 Connection con = new Connection(temp); con.start(); connections.add(con); sockets.add(temp); } catch (IOException ex) { ex.printStackTrace(); } } } }).start(); ``` 这是客户端线程类: ```java class Connection extends Thread{ Socket socket; BufferedReader reader; PrintWriter writer; public Connection(Socket socket){ this.socket = socket; } @Override public void run() { System.out.println("来了!"); try { reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); writer = new PrintWriter(socket.getOutputStream()); // 第一次连接,先写出已经存在的联系人 writer.println("还没有联系人"); // 再读取新建联系人的名字 String clientName = reader.readLine(); System.out.println("客户端名字:" +clientName); reader.close(); } catch (IOException e) { e.printStackTrace(); } /* while (true){ try { if (socket.isConnected() == false){ break; } } catch (Exception e) { e.printStackTrace(); } }*/ } } ``` 这是客户端启动时执行的方法: ```java @Override public void windowOpened(WindowEvent e) { // 窗口打开就建立连接 try { socket = new Socket("localhost",3030); reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); writer = new PrintWriter(socket.getOutputStream()); } catch (IOException ex) { JOptionPane.showMessageDialog(null,"服务器未开启,不能连接,请关闭此客户端!"); } /* 连接一旦建立需要立刻执行的事情 * 1、向服务器发送该客户端的名字 * 2、获取其他已经存在的客户端名字 * */ try { System.out.println(reader.readLine()); writer.println(clientName); } catch (IOException ex) { ex.printStackTrace(); } } ``` 每次一到这个windowOpen方法的System.out.println(reader.readLine());这里就卡死,没有报错,直接卡住。 看了网上说什么readline()会因为没读到数据阻塞,所以猜想是服务端发送数据时一直没有发出来,不过没有找到解决办法,这是卡住时的情况截图 ![图片说明](https://img-ask.csdn.net/upload/201911/08/1573184051_750205.png)
通过C++/java socket向服务器端传递字符串并接收服务器的反馈字符串与使用浏览器实现相同功能有何区别?
1.在写一个打开网络服务的软件的接口时(win10环境),用c++和java 的socket分别写了两个客户端,客户端的功能是通过端口8081向本地服务器localhost发送字符串“?scanX”,然后接收服务器的反馈“done!",但是在接收的过程中会出现网络中断,要写接口的软件报错;但如果用浏览器,直接在地址栏输入"http://127.0.0.1:8081/?scanB" ,浏览器会直接显示"done!".我想解决的是用c++写一个接口exe能及时向服务器传递字符串并接收反馈,但此时反馈出现了问题,本人小白,问了很多前辈也未能解决疑问,在此求教各位前辈,大佬。 2.以下为c++代码段,运行到"sended request success!"后网络服务器不知为何断开,要写接口的软件报错 #include <iostream> #include <windows.h> using namespace std; //在windows网络编程中需要引入库 #pragma comment(lib, "wsock32.lib") int main(int argc, char *argv[]) { //在windows网络编程中导入库,linux中不需要 WSADATA Ws; if (WSAStartup(MAKEWORD(2, 2), &Ws) != 0) { cout << "Init Windows Socket Failed::" << GetLastError() << endl; return -1; } //通过域名获取IP地址 HOSTENT *host_entry = gethostbyname("127.0.0.1"); if (!host_entry){ return -1; } //将网络字节序的网络地址转为本地字节序 char *serverIP = inet_ntoa(*((struct in_addr *)host_entry->h_addr)); cout << "server IP is " << serverIP << endl; //创建socket并且绑定了TCP协议 int hsocket = socket(AF_INET, SOCK_STREAM, 0); //socket创建失败,一般都是系统资源没有了,或者没有权限 if (hsocket == INVALID_SOCKET) *** { cout << "Create Socket Failed::" << GetLastError() << endl; return -2; } //连接http服务器 sockaddr_in servAddr; servAddr.sin_family = AF_INET; servAddr.sin_port = htons(8081); //指定端口号 servAddr.sin_addr.S_un.S_addr = inet_addr(serverIP); if (connect(hsocket, (struct sockaddr*)&servAddr, sizeof(servAddr)) == -1) { cout << "Connect error" << endl; return -3; } else cout << "Connected "<<serverIP<<" successed!" << endl; //发出页面URL请求数据 char req[] = "?connect0"; //注意send并不能保证你指定大小的数据它能够全部发送, if (send(hsocket, req, (int)strlen(req), 0) < 0) { cout << "send request error" << endl; return -4; } cout << "sended request success!" << endl; //接收数据的缓冲,应为是字符串所以结尾要加\0,我们一开始就将它全部置0 char buffer[10000] = {0}; int len; if ( recv(hsocket, buffer, sizeof(buffer)-1, 0) <0) { cout << "read error" << endl; exit(1); } cout << buffer << endl; getchar(); return 0; } ``` ``` 这是运行结果 ![图片说明](https://img-ask.csdn.net/upload/201903/24/1553395763_716349.png) 软件报错(查百度说这句话是因为读取软件数据导致的,不知正确与否) ![图片说明](https://img-ask.csdn.net/upload/201903/24/1553395434_777007.png) 对比使用浏览器通信,能直接收到反馈 ![图片说明](https://img-ask.csdn.net/upload/201903/24/1553395626_39803.png)
使用eclipse用TCP协议创建服务器和客户端,从客户端向服务器传文件
服务器代码: package com.xfr.test; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; public class Test2_UpLoadServer { /**  * @param args  * @throws IOException   */ public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(6666); //创建服务器,绑定端口号777 System.out.println("启动服务器,端口号为6666!!!"); while(true){ final Socket socket = server.accept();  //接收客户端的请求,有可能接收多个客户端的请求,所以用多线程 new Thread(){ public void run(){ try { InputStream  is = socket.getInputStream(); //拿到客户端的流 BufferedReader br = new BufferedReader(new InputStreamReader(is)); //用Buffer缓冲区更好读取 PrintStream ps = new PrintStream(socket.getOutputStream()); //用PrintStream的好处是可以写字符也可以写字节 String fileName = br.readLine();//接收到要上传的文件的名字 File dir = new File("upload"); //创建一个文件夹来存放文件 dir.mkdir(); File file = new File(dir,fileName); //对文件名字进行封装来进行判断操作 if(file.exists()){ ps.println("存在"); //若文件在服务器中存在,给与客户端提示 socket.close(); }else{ //文件在服务器中没有,则开始接收 FileOutputStream fos = new FileOutputStream(file); byte[] arr = new byte[8192]; int len; while(( len = is.read(arr)) != -1){ fos.write(arr, 0, len); } fos.close(); //记得关流和关端口 socket.close(); } } catch (IOException e) { e.printStackTrace(); } } }.start(); } } } 客户端代码: package com.xfr.test; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; public class Test2_UploadClient { /**  * 向服务器上传文件,文件路径从键盘获取  * @param args  * @throws IOException   * @throws UnknownHostException   */ public static void main(String[] args) throws UnknownHostException, IOException { Socket socket = new Socket("169.254.33.252",6666);//创建客户端 File file = getFile();//获取文件 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintStream ps = new PrintStream(socket.getOutputStream()); ps.println(file.getName()); //将文件名字传给服务器,服务器再对其进行判断 String result = br.readLine(); if("存在".equals(result)){ System.out.println("该文件在服务器中已经存在,请不要重复上传!"); socket.close(); return; } else { //文件不存在的话,开始读取该文件 FileInputStream fis = new FileInputStream(file); byte[] arr = new byte[8192];  int len; while((len = fis.read(arr)) != -1){ ps.write(arr, 0, len);//向服务器传 } fis.close(); socket.close();//F:\Test\aaa.txt } } public static File getFile() { Scanner sc = new Scanner(System.in); while(true){ String s = sc.nextLine(); File file = new File(s); if(!file.exists()){ System.out.println("您要上传的文件不存在!重新输入文件路径:"); } else if(file.isDirectory()){ System.out.println("您输入的是文件夹路径!重新输入文件路径:"); } else{ return file; } } } } ###执行后输入路径,路径正确的话程序不会停下来,红方块一直在 ![图片说明](https://img-ask.csdn.net/upload/201710/25/1508926710_596979.png) 手动点掉红方块后刷新项目 ![图片说明](https://img-ask.csdn.net/upload/201710/25/1508926743_190021.png) 可以看到eclipse当前路径多了要拷贝的文件,可是文件字节大小为0 ![图片说明](https://img-ask.csdn.net/upload/201710/25/1508926754_412742.png) 更多
java中把Socket.accept放入多线程中 如果一个客户端连入 那么会接入哪一个线程中呢
如题 自己测试出来是连接不到 不明白 。。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。。。。。。。。
java C/S socket通信多线程问题
问题如下:客户端起十个线程,每个线程向服务端发一万次信息,服务端起五个线程,分别接收客户端的请求,每收到一次信息,数据库里把请求次数加一。执行完成后,验证一下数据库里请求次数是否为十万次.使用了Mybatis框架来操作数据库,代码如下. 问题是:如果不加数据库操作,是可以完整收到10W个信息.但是如果加上数据库操作,就会少收到3000条左右的信息,问题在哪?怎么解决?或者用其他什么方法可以解决. 客户端: ``` package homework8; import java.io.OutputStreamWriter; import java.net.InetAddress; import java.net.Socket; public class Client { Socket clientSocket; OutputStreamWriter outputStreamWriter ; public static void main(String[] args) throws Exception{ new Client().connect(); } class MyThread extends Thread { public void run(){ int i; for(i=0;i<10000;i++){ try{ System.out.println(Thread.currentThread().getName()+"执行第"+i+"次发送"); outputStreamWriter.write("哈哈"+"\r\n"); outputStreamWriter.flush(); }catch(Exception e){ e.printStackTrace(); } } } } public void connect() throws Exception{ clientSocket =new Socket(InetAddress.getLocalHost(),8088); outputStreamWriter=new OutputStreamWriter(clientSocket.getOutputStream()); for(int k=0;k<10;k++){ MyThread thread=new MyThread(); thread.start(); } } } ``` 服务器: ``` package homework8; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; import org.apache.ibatis.session.SqlSession; import util.MybatisUtil; public class Server1 { static Server1 server; BufferedReader bufferedReader; public int times; public int i=1; ServerThread st; ServerSocket ss; private static final int SERVER_PORT =8088; //接收客户端请求 并启动线程 public void update(int k) throws Exception{ SqlSession sqlSession = null; try{ sqlSession = MybatisUtil.getSqlSession(); sqlSession.update("requestNamespace.update",k); sqlSession.commit(); }catch(Exception e){ e.printStackTrace(); sqlSession.rollback(); throw e; }finally{ MybatisUtil.closeSqlSession(); } } public void receive() throws Exception{ ss=new ServerSocket(SERVER_PORT); try { while (true) { Socket socket = ss.accept(); bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream())); st=new ServerThread(); Thread thread1 = new Thread(st, "SyncThread1"); Thread thread2 = new Thread(st, "SyncThread2"); Thread thread3 = new Thread(st, "SyncThread3"); Thread thread4 = new Thread(st, "SyncThread4"); Thread thread5 = new Thread(st, "SyncThread5"); thread1.start(); thread2.start(); thread3.start(); thread4.start(); thread5.start(); } }catch (IOException e) { }finally { ss.close(); } } //创建线程的内部类 class ServerThread implements Runnable { public void run() { try { String line="a"; while (!line.equals("qwerty")) { synchronized (this) { line=bufferedReader.readLine(); System.out.println(Thread.currentThread().getName()+"接收了第"+i+"个"+line); i++; update(i); } } }catch (Exception e) { e.printStackTrace(); System.out.println("接收完毕"); try{ ss.close(); }catch(Exception x){ x.printStackTrace(); } } } } //启动服务器 public static void main(String[] args)throws Exception { server=new Server1(); server.receive(); } } ``` Mybatis工具类 ``` package util; import java.io.IOException; import java.io.Reader; import java.sql.Connection; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MybatisUtil { private static ThreadLocal<SqlSession> threadLocal=new ThreadLocal<SqlSession>(); private static SqlSessionFactory sqlSessionFactory; //加载mybatis配置文件 static{ try { Reader reader=Resources.getResourceAsReader("mybatis.config.xml"); sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } } //获取线程 public static SqlSession getSqlSession(){ //从当前线程中获取SqlSession对象 SqlSession sqlSession = threadLocal.get(); if(sqlSession == null){ //在SqlSessionFactory非空的情况下,获取SqlSession对象 sqlSession = sqlSessionFactory.openSession(); //将SqlSession对象与当前线程绑定在一起 threadLocal.set(sqlSession); } //返回SqlSession对象 return sqlSession; } //关闭SqlSession与当前线程分开 public static void closeSqlSession(){ //从当前线程中获取SqlSession对象 SqlSession sqlSession = threadLocal.get(); //如果SqlSession对象非空 if(sqlSession != null){ //关闭SqlSession对象 sqlSession.close(); //分开当前线程与SqlSession对象的关系 threadLocal.remove(); } } public static void main(String[] args) { Connection conn = MybatisUtil.getSqlSession().getConnection(); System.out.println(conn!=null?"连接成功":"连接失败"); } } ```
相见恨晚的超实用网站
搞学习 知乎:www.zhihu.com 简答题:http://www.jiandati.com/ 网易公开课:https://open.163.com/ted/ 网易云课堂:https://study.163.com/ 中国大学MOOC:www.icourse163.org 网易云课堂:study.163.com 哔哩哔哩弹幕网:www.bilibili.com 我要自学网:www.51zxw
花了20分钟,给女朋友们写了一个web版群聊程序
参考博客 [1]https://www.byteslounge.com/tutorials/java-ee-html5-websocket-example
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
字节跳动视频编解码面经
引言 本文主要是记录一下面试字节跳动的经历。 三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时
开源一个功能完整的SpringBoot项目框架
福利来了,给大家带来一个福利。 最近想了解一下有关Spring Boot的开源项目,看了很多开源的框架,大多是一些demo或者是一个未成形的项目,基本功能都不完整,尤其是用户权限和菜单方面几乎没有完整的。 想到我之前做的框架,里面通用模块有:用户模块,权限模块,菜单模块,功能模块也齐全了,每一个功能都是完整的。 打算把这个框架分享出来,供大家使用和学习。 为什么用框架? 框架可以学习整体
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成喔~) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch
深深的码丨Java HashMap 透析
HashMap 相关概念 HashTab、HashMap、TreeMap 均以键值对像是存储或操作数据元素。HashTab继承自Dictionary,HashMap、TreeMap继承自AbstractMap,三者均实现Map接口 **HashTab:**同步哈希表,不支持null键或值,因为同步导致性能影响,很少被使用 **HashMap:**应用较多的非同步哈希表,支持null键或值,是键值对...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
Python 基础(一):入门必备知识
目录1 标识符2 关键字3 引号4 编码5 输入输出6 缩进7 多行8 注释9 数据类型10 运算符10.1 常用运算符10.2 运算符优先级 1 标识符 标识符是编程时使用的名字,用于给变量、函数、语句块等命名,Python 中标识符由字母、数字、下划线组成,不能以数字开头,区分大小写。 以下划线开头的标识符有特殊含义,单下划线开头的标识符,如:_xxx ,表示不能直接访问的类属性,需通过类提供
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
JDK12 Collectors.teeing 你真的需要了解一下
前言 在 Java 12 里面有个非常好用但在官方 JEP 没有公布的功能,因为它只是 Collector 中的一个小改动,它的作用是 merge 两个 collector 的结果,这句话显得很抽象,老规矩,我们先来看个图(这真是一个不和谐的图????): 管道改造经常会用这个小东西,通常我们叫它「三通」,它的主要作用就是将 downstream1 和 downstre...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
相关热词 c#选择结构应用基本算法 c# 收到udp包后回包 c#oracle 头文件 c# 序列化对象 自定义 c# tcp 心跳 c# ice连接服务端 c# md5 解密 c# 文字导航控件 c#注册dll文件 c#安装.net
立即提问