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

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

5个回答

简单的聊天室:

 ==========================================================================================
server:

import  java.net.*; 
import  java.io.*; 
import  java.util.*; 

public  class  ServerSocketDemo   
{

    public  static  void  main(String[]  args) 
    { 
        ArrayList list = new ArrayList();
        ServerSocket  ss = null;

        try {
            ss =new  ServerSocket(8189); 

            while(true) 
            { 
                Socket  s=ss.accept(); 
                list.add(s); 
                new  ReverseDemo(s,list); 
            }
        }catch( Exception ex ) {
        }
        try {
            ss.close();
        }catch( Exception ex ) {
        } 
    }
}

import  java.net.*; 
import  java.io.*; 
import  java.util.*; 

public class  ReverseDemo  extends  Thread 
{ 
    BufferedReader  in=null; 
    PrintWriter  out=null; 
    String  str="abc"; 
    ArrayList  list; 
    Socket  s; 

    public  ReverseDemo(Socket  s,ArrayList  list) 
    { 
        this.list=list; 
        this.s=s; 
        this.start(); 
    }
    public  void  run() 
    { 

        try 
        { 
            InputStream inStream = s.getInputStream();
            OutputStream outStream = s.getOutputStream();

            PrintWriter out = new PrintWriter(outStream, true /* autoFlush */);
            System.out.println(s.getInetAddress().getHostAddress()+"  connected-------");
            out.println("连接成功!");

            byte[] buf = new byte[1024];

            while(true) 
            {
                int bytes_read = inStream.read( buf );
                if( bytes_read < 0 ) {
                    break;
                } else {
                    broadcast( buf, 0, bytes_read );
                }       
            } 
          } 
          catch  (Exception  ex) 
          { 
              ex.printStackTrace(); 
          }
          finally {
              list.remove( s );
          } 
    }


    void broadcast( byte[] b, int offset, int length ) {
        for( int i = 0, n = list.size(); i < n; i++ ) {
            Socket sock = (Socket) list.get( i );
            if( sock != s ) {
                try {
                    sock.getOutputStream().write( b, offset, length );
                    sock.getOutputStream().flush();
                }catch( Exception ex ) {
                }
            }
        }
    }
} 

===================================================================================
client:


/**
  @version 1.20 2004-08-03
  @author Cay Horstmann
*/

import java.io.*;
import java.net.*;
import java.util.*;

/**
  This program makes a socket connection to the atomic clock
  in Boulder, Colorado, and prints the time that the
  server sends.
*/
public class SocketTest
{
    private Socket sock_;
    private byte[] name_; 

    public SocketTest( String host, int port, byte[] name ) throws Exception {
        name_ = name;
        sock_ = new Socket( host, port );
        Thread th = new Thread( createMsgRecvRunnable() );
        th.start();
        byte[] b = new byte[ 1024 ];

        int bytes_read = readMsg( b );
        while( bytes_read > 0 ) {
            sendMsg( b, 0, bytes_read );
            bytes_read = readMsg( b );
        }
    }

    private Runnable createMsgRecvRunnable() {
        return new Runnable() {
            public void run() {
                try {
                    InputStream in = sock_.getInputStream();
                    byte[] buf = new byte[1024];

                    while( true ) {
                        int bytes_read = in.read( buf );
                        if( bytes_read < 0 ) {
                            break;
                        } else {
                            System.out.write( buf, 0, bytes_read );
                        }
                    }
                }catch( Exception ex ) {
                }
            }
        };
    }

    private int readMsg( byte[] b ) throws Exception {
        return System.in.read( b );
    }

    private void sendMsg( byte[] msg, int offset, int length ) throws Exception {
        sock_.getOutputStream().write( name_ );
        sock_.getOutputStream().write( msg, offset, length );
        sock_.getOutputStream().flush();
    }

    public static void main( String[] args ) {
        try {
            String name = null;

            if( args.length > 0 ) {
                name = args[0] + ":";
            } else {
                name = "unknown:";
            }
            SocketTest test = new SocketTest( "localhost", 8189, name.getBytes() );
        }catch( Exception ex ) {
            ex.printStackTrace();
        }
    }

} 

多线程参考:
Java Socket网络编程--聊天室的实现(多线程实现无需等待对方响应版本):http://wenku.baidu.com/link?url=LUqWTEcoIuO7wEzby14517TqNaDqOmKUEXrvGOegWKIa2Oq5tscyGkiRa0jkGPxxuGryTf4yhhvfoc2S-w6tsKJNoPDccI83gsfqYCLeokG

源码比较长,把你邮箱留下下班后发给你。

qq_33428426
745620128 你好 能麻烦你发给我一份源码么 745620128@qq.com 急谢谢
3 年多之前 回复
asongjun
asongjun 回复miss2671228: 906529775@qq.com求一份java+websocket 即时聊天的源码,谢谢了
大约 4 年之前 回复

如果只是纯技术研究,可以研究一下 openfire 解决方案,是一款 移动IM解决方案,不过思路差不多的

做一个服务器端,一个客户端,服务器负责转发就行了,具体代码留邮箱。

qq_33428426
745620128 你好 能麻烦你发给我一份源码么 745620128@qq.com 急谢谢
3 年多之前 回复
asongjun
asongjun 回复晓月魂殇: 906529775@qq.com求一份java+websocket 即时聊天的源码,谢谢了。
大约 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
初次写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); } } }
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?"连接成功":"连接失败"); } } ```
java关于socket 多线程的问题
现在是指定一个时间,应用启动就开始定时扫描,隔一分钟扫描一次,到了指定的时间我就需要去Ping两千多台电脑,用多线程处理,每个线程负责50个。我该怎么处理?各位大神们,先说说思路再给我写点简单的代码啊。救急啊,我第一次搞这些东西完全不会额。
Socket实现多线程通信
我现在想做一个基于Java的Socket多线程通信的demo,服务端可以接受客户端发过来的数据,客户端是硬件,要求只知道服务端的IP及端口就可以发数据,不知道服务端怎么写,求大家的帮助,最好有代码,谢谢
socket编程多线程如何处理客户端不同请求
我现在在服务端想采用多线程处理客户端的连接,发消息,收消息,更新客户列表, 但是我是如何才能知道客户端想要干什么呢? 这个别人的代码 ,他是通过switch判断的,我现在想明白如何实现这个switch过程,控制台程序。 希望大佬回答详细点 ,初如编程很多不明白![图片说明](https://img-ask.csdn.net/upload/201708/01/1501555996_986604.png)
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)
socket,多线程,死循环
我使用socket和多线程来进行程序之间通信,然后用死循环来监听,但是现在我在监听到某些数据的时候,创建GUI界面,被无限刷新了
socket和多线程的混合使用
怎么写一个利用多线程和socket实现客户端连续向服务端上传多张图片啊并且保存?
mina框架中socket的多线程模式怎写?
mina框架中socket的多线程模式,上网找了很久了,开始以为是添加这行代码:chain.addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool())); 就行了。但发觉虽然是可以开启多个会话,但是有些会话不发送信息了,也没被关闭。是不是关于线程的问题呢。希望有人用mina框架的socket做过多线程处理的,可以提点下我,谢谢了。方便可以叫我qq:1604587251.
socket编程多线程文件传输
要实现的是开多线程传输一个文件,目的是提高传输速度。 思路是这样的:服务端开多线程,将文件分割,一个线程传输一块,客户端也开多线程,每个线程接受一块,最后拼成一个完整的文件。服务端支持多线程, 客户端要支持多线程, 然后客户端每个线程都建立连接到服务端请求一个文件的某个分片。 希望大家可以提供一下类似的代码,现在只有思路不知道怎么下手。
QT5中 socket 与 多线程的问题(聊天程序)
大家好 我在用QT5写一个聊天程序 用的是c/c++的封装的socket函数(QT封装的UDP不知道为什么不能正常发包) 问题是这样的: 有两个窗口 1. MainWindow 类的 login,程序启动首先显示它 2. Dialog 类的 chat, 要求登陆成功后才显示它 这两个窗口在main中QApplication a 和 a.exec()之间创建。 login窗口其中一个button点击后可以向服务器发送一个登陆请求,那么,如何 接收这个请求呢?我目前的做法是同样将这个button connect了一个receive函数, 不过只接受一个包,这样实现真的很丑,而且无法做到持续监听(这是chat窗口中的 关键) 我尝试用了c++11的thread来写多线程,传入一个窗口的指针,但好像不允许在子线程里调用窗口类实例的show()之类的函数,报错了(这点也是我很想知道的,类中定义的public成员函数可以在子线程中调用,但是不能调用诸如show(), close()之类的函数) 我刚学QT没多久,参考的很多QT聊天程序都是用QT封装的socket,但是这边用不了,如果一定要用c/c++封装的 有什么好的解决办法来实现吗?
java多线程Connection
在最近的设计作业中,想问一下,本人要做一个点菜系统,所以会有许多的客户端,在这种多线程的情况下,Connection能共用吗?就是多线程共用一个Connection会不会出现问题? 还有客户端是不是都要使用Socket这些呢?第一次不懂。。。。
JAVA多线程Socket通信时遇到的问题???
实验过程中,服务器和客户端都能连接上了,但是服务器就是收不到客户端发来的字符串。 ![图片说明](https://img-ask.csdn.net/upload/201512/30/1451482301_784521.png) 再贴一下代码: //Mult.java package t14_chapter; import java.io.*; import java.net.*; class Mult extends Thread{ private Socket socket; private BufferedReader in; private PrintWriter out; public Mult(Socket s)throws IOException{ socket =s; in=new BufferedReader(new InputStreamReader(s.getInputStream())); out=new PrintWriter(new OutputStreamWriter(s.getOutputStream()),true); start(); } public void run() { try{ while(true){ String str=in.readLine(); //wait(1000); if(str.equals("END")) break; System.out.println("Receiving and echoing:"+str); out.println(str); } System.out.println("closing..."); }catch(IOException e){} finally{ try{ socket.close(); }catch(IOException e){} } } } //ServerSocketMult.java package t14_chapter; import java.io.*; import java.net.*; public class ServerSocketMult { static final int PORT=8080; public static void main(String[] args)throws IOException{ ServerSocket s=new ServerSocket(PORT); System.out.println("Server Startes"); try{ while(true){ Socket socket=s.accept(); System.out.println("Connection success!"); try{ new Mult(socket); } catch(IOException e){} finally{ socket.close(); } } } catch(IOException e){} finally{ s.close(); } } } //ClientSocketMultThread.java package t14_chapter; import java.io.*; import java.net.*; class ClientSocketMultThread extends Thread{ private Socket socket; private BufferedReader in; private PrintWriter out; private static int counter=0; private int id=counter++; private static int threadcount=0; public static int threadCount(){ return threadcount; } public ClientSocketMultThread(InetAddress addr){ System.out.println("Making client"+id); threadcount++; try{ socket =new Socket(addr,ServerSocketMult.PORT); }catch(IOException e){ } try{ in=new BufferedReader(new InputStreamReader(socket.getInputStream())); out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true); start(); }catch(IOException e){ try{ socket.close(); }catch(IOException e2){} } } public void run(){ try{ for(int i=0;i<25;i++){ out.println("Client"+id+"i"); String str=in.readLine(); System.out.println(str); } out.println("END"); }catch(IOException e){} finally{ try{ socket.close(); }catch(IOException e){} threadcount--; } } } //ClientSocketMult.java package t14_chapter; import java.io.*; import java.net.*; public class ClientSocketMult { static final int MAX_THREADS=40; public static void main(String[] args)throws IOException,InterruptedException{ InetAddress addr=InetAddress.getByName(null); while(true){ if(ClientSocketMultThread.threadCount()<MAX_THREADS) new ClientSocketMultThread(addr); Thread.sleep(100); } } } 跪求大神求救!!!!
java socket多线程的时间问题
各位大神你们好, 我正在用java写一个接收服务器数据并进行统计的程序, 我用的是多线程socket. 该程序要求能够每秒钟接收几千条数据, 数据中包含value和timestamp以及其他字段. 每个数据通过单独的连接发送, 接收之后统计每秒的钟数据的最大值与平均值(指的是数据中所含有的"value"字段的值), 并将其存储到本地. 但是使用多线程时我有个疑问, 就是怎么判断是否到了1秒. 如果使用本地时钟计算肯定会与服务器有出入, 每秒几千条差别肯定不小; 后来我想从接受到的数据时间戳来判断, 但是又想到多线程可能会存在数据到达的顺序与时间顺序不一致的问题, 有可能时间比较晚的反而早到, 这样就可能漏掉一些数据. 求各位高手大神哥哥姐姐们指点我一下, 不胜感激, 挺急的, 在线等 :)
如何用java线程池和socket实现群聊和私聊,求大神指教
刚学习完javaSE,需要做一个小小的聊天软件,需要实现私聊和群聊的功能;本人觉得应当使用线程池和socket、IO流来实现,但不知道怎么做?求各位大神给点意见,不胜感激~
利用Java的socket编程,实现本地聊天(只模拟发送数字)
源码如下: package myqq; import java.io.BufferedInputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class Chat { public static void main(String[] args){ SendMessage sendMessage = new SendMessage(); ReceiptMessage receiptMessage = new ReceiptMessage(); sendMessage.start(); receiptMessage.start(); } } class SendMessage extends Thread{ public void run() { System.out.println("发送线程已启动!"); try{ Socket c = new Socket("127.0.0.1", 9000); Scanner input = new Scanner(System.in); OutputStream os = c.getOutputStream(); int msg = 0; while(msg!=886){ msg = input.nextInt(); os.write(msg); } os.close(); c.close(); }catch (Exception e) { System.out.println("服务器异常,停止服务"); e.printStackTrace(); } } } class ReceiptMessage extends Thread{ public void run() { System.out.println("接收线程已启动!"); try{ ServerSocket ss = new ServerSocket(9000); System.out.println("服务器端开始监听9000端口"); //获取输入流 Socket s = null; InputStream is = new BufferedInputStream(null); int msg = 0; do{ s = ss.accept(); is = s.getInputStream(); msg = is.read(); System.out.println(msg); } while(msg!=886); is.close(); s.close(); }catch (Exception e) { System.out.println("服务器异常,停止服务"); e.printStackTrace(); } } } 问题:编译能通过,执行时报错![图片说明](https://img-ask.csdn.net/upload/201701/10/1484042256_84246.png) 这个什么问题啊?
Socket多线程遍历一个数组
现在传来一个List里面装的IP,大概两千多条数据,我应该怎样实现多线程遍历?最好是简单的代码解释。谢谢大神了。
Windows下php socket通信怎么实现多线程操作?
php socket通信,我想实现多个客户端可以独立连接,接受发送数据,不知道怎么实现,是在Windows下的,
java 单纯使用socket实现FTP下载功能
FTP服务器目录: F:/FTP / \ **b** a.txt / \ **c** **b.txt** / **c.txt** (没有加上后缀txt的都是文件夹) 假设客户端需要下载整个F:/FTP/b ,问题:服务器和客户端用什么方式来 同步输出流和输入流(局域网两台机子测试)
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、PDF搜索网站推荐 对于大部
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入  假设现有4个人
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 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)杨辉三角
写在前面: 我是 扬帆向海,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。 这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。 用知识改变命运,让我们的家人过上更好的生活。 目录一、杨辉三角的介绍二、杨辉三角的算法思想三、代码实现1.第一种写法2.第二种写法 一、杨辉三角的介绍 百度
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
SQL-小白最佳入门sql查询一
一 说明 如果是初学者,建议去网上寻找安装Mysql的文章安装,以及使用navicat连接数据库,以后的示例基本是使用mysql数据库管理系统; 二 准备前提 需要建立一张学生表,列分别是id,名称,年龄,学生信息;本示例中文章篇幅原因SQL注释略; 建表语句: CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // dosho
【图解经典算法题】如何用一行代码解决约瑟夫环问题
约瑟夫环问题算是很经典的题了,估计大家都听说过,然后我就在一次笔试中遇到了,下面我就用 3 种方法来详细讲解一下这道题,最后一种方法学了之后保证让你可以让你装逼。 问题描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 的 士兵会被杀死出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。 1、方
致 Python 初学者
文章目录1. 前言2. 明确学习目标,不急于求成,不好高骛远3. 在开始学习 Python 之前,你需要做一些准备2.1 Python 的各种发行版2.2 安装 Python2.3 选择一款趁手的开发工具3. 习惯使用IDLE,这是学习python最好的方式4. 严格遵从编码规范5. 代码的运行、调试5. 模块管理5.1 同时安装了py2/py35.2 使用Anaconda,或者通过IDE来安装模
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,
程序员:我终于知道post和get的区别
IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。 此话一出,不知激起了多少(码农)程序员的愤怒,却又无可奈何,于是码农问程序员。 码农:你知道get和post请求到底有什么区别? 程序员:你看这篇就知道了。 码农:你月薪三万了? 程序员:嗯。 码农:你是怎么做到的? 程序员:
《程序人生》系列-这个程序员只用了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
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下
日均350000亿接入量,腾讯TubeMQ性能超过Kafka
整理 | 夕颜出品 | AI科技大本营(ID:rgznai100) 【导读】近日,腾讯开源动作不断,相继开源了分布式消息中间件TubeMQ,基于最主流的 OpenJDK8开发的
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车? 某胡同口的煎饼摊一年能卖出多少个煎饼? 深圳有多少个产品经理? 一辆公交车里能装下多少个乒乓球? 一
相关热词 c#选择结构应用基本算法 c# 收到udp包后回包 c#oracle 头文件 c# 序列化对象 自定义 c# tcp 心跳 c# ice连接服务端 c# md5 解密 c# 文字导航控件 c#注册dll文件 c#安装.net
立即提问