java socket 多次反复通信

我用java socket实现简单的通讯功能,在做登陆的时候,客户端将用户名密码读取出来
发送给服务器(这是第一步),服务器读取信息后校验(这是第二步),校验后发送给客户端,客户端读取是否登陆成功的消息(这是第三步),但是,第一步第二步都没问题,但客户端无法将服务器再次发送的消息读取出来,下面是我的部分代码,我不知道怎么实现这种多次反复通信的问题,希望大家不吝赐教。
服务器代码:
output = new OutputStreamWriter(socket.getOutputStream());
input = new DataInputStream(socket.getInputStream());
byte [] b2=new byte[1024];
int len=input.read(b2);
String str = new String(b2,0,len); //读取用户名密码
System.out.println("客户端接收到的用户名密码:"+str);
//此处校验代码省略,假设用户名密码正确
output.write("reponse:1"); //发送给客户端登陆消息
System.out.println("服务器消息:登陆消息已发给客户端");

服务器控制台:
已启动监听,调用线程进入等待阶段……
服务器消息,客户端已响应
服务器消息:服务器已经建立与客户端的连接,客户端ip:/127.0.0.1
已启动监听,调用线程进入等待阶段……
客户端接收到的用户名密码:command:1;userName:username;passWord:password
服务器消息:登陆消息已发给客户端

客户端代码:
input = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
DataOutputStream output =
new DataOutputStream(socket.getOutputStream());
byte[] b = MainWindow.DATA.getBytes(); //将用户名密码转化为byte
output.write(b); //发送给服务器
System.out.println("用户名,密码信息已发送");
output.flush();
String str = input.readLine(); //读取服务器消息
System.out.println("客户端消息:已读取到登录信息");
if(str.equals("reponse:1")){
LoginDialogs.AUTH = true; //授予客户端登录权限
}
System.out.println(LoginDialogs.AUTH);
客户端控制台:
已连接
登陆按钮消息:已点击
用户名,密码信息已发送

weixin_42307180
` 颜 请问 大佬解决了这个问题么?
大约一年之前 回复

1个回答

今天在做一个东东的时候,再次用到了socket,对于java来说,简单的网络通信,基本都会想到使用socket实现。那么接下来问题来了,挖掘机技术哪家强呢?(ps:开个玩笑哈)
在socket通信的时候,当传输数据的时候,可能使用String字符串类型,byte数组类型,等等。那么问题真的来了,使用String字符串怎传输呢?这个就是今天的话题,那么直接上代码喽:(注:主要要看红色标记的,绿......
答案就在这里:java中的Socket通信
----------------------Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的答案,除了赞同,你还有别的选择吗?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
JAVA中Socket对象如何重用多次?

试了一下,目前已知的 让socket发送流中的数据 只有一下三种方式 1.shutDown流 2.close流/close socket 3.sendUrgentData 前两种都会socket对象无法再次使用,如果想多次发送数据,只能用第3种。 有更优雅的方式实现socket重用吗?

Java中的Socket服务中如何实现客户端和服务端多次通讯

比如,服务器给客户端发一个信息。然后服务端根据客户端发送的信息判断,再回复一个信息,就是多次读和写的问题

java socket传输中用到split差分用户名密码

为什么我的代码不能支持多次登录,每登陆一次就要将服务器端代码再运行一次 // 客户端 传送账号密码 PrintWriter pw = new PrintWriter(new OutputStreamWriter((s.getOutputStream())),true); pw.println(user+"%"+pass); //客户端 返回服务端验证结果 BufferedReader br = new BufferedReader( new InputStreamReader(s.getinputstream())); String yorn = br.readLine(); if(yorn.equals("1")){ this.setVisible(false); new QQMain();//密码账号正确 进如QQ主页面 }else{ JOptionPane.showMessageDialog(this, "对不起,用户名或密码错误"); } //服务端 接收用户名和密码 BufferedReader br = new BufferedReader( new InputStreamReader(s.getinputstream())); String uandp = br.readLine(); String u =""; String p =""; try{ u = uandp.split("%")[0];//取账号 p = uandp.split("%")[1];//取密码 }catch(Exception e){} PrintWriter pw = new PrintWriter(new OutputStreamWriter((s.getOutputStream())),true); if(u.equals("liangyu")&&p.equals("521")){ //如果账号密码正确发送正确信息到客户端 pw.println("1"); }else{ //发送错误信息到客户端 pw.println("0"); } 附上错误 java.net.ConnectException: Connection refused: connect at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) at java.net.Socket.connect(Socket.java:519) at java.net.Socket.connect(Socket.java:469) at java.net.Socket.<init>(Socket.java:366) at java.net.Socket.<init>(Socket.java:180) at 客户端界面.QQLogin.actionPerformed(QQLogin.java:81) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.Component.processMouseEvent(Component.java:6216) at javax.swing.JComponent.processMouseEvent(JComponent.java:3265) at java.awt.Component.processEvent(Component.java:5981) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4583) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4413) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4556) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4220) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4150) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Window.dispatchEventImpl(Window.java:2475) at java.awt.Component.dispatchEvent(Component.java:4413) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) java.net.ConnectException: Connection refused: connect at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) at java.net.Socket.connect(Socket.java:519) at java.net.Socket.connect(Socket.java:469) at java.net.Socket.<init>(Socket.java:366) at java.net.Socket.<init>(Socket.java:180) at 客户端界面.QQLogin.actionPerformed(QQLogin.java:81) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.Component.processMouseEvent(Component.java:6216) at javax.swing.JComponent.processMouseEvent(JComponent.java:3265) at java.awt.Component.processEvent(Component.java:5981) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4583) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4413) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4556) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4220) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4150) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Window.dispatchEventImpl(Window.java:2475) at java.awt.Component.dispatchEvent(Component.java:4413) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

服务端与客户端多次发送数据,socket不能关闭,那么客户端如何读到流末尾

服务端与客户端多次交互发送数据,socket不能关闭,那么客户端如何读到流末尾

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?"连接成功":"连接失败"); } } ```

使用socket通信,android客户端,java写的服务器,传输数据时总出现异常

客户端: public void run() { // TODO Auto-generated method stub try { s = new Socket(ip, port); DataOutputStream os = new DataOutputStream(s.getOutputStream()); os.writeUTF("可以准备接收了吗?"); ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); out.writeObject(u); out.flush(); out.close(); System.out.println("用户名是:"+u.getID()); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } ``` ``` 服务器: ``` try{ ServerSocket ss = new ServerSocket(9999); System.out.println("服务器正在监听!"); Socket s = ss.accept(); System.out.println("建立连接!"); DataInputStream is = new DataInputStream(s.getInputStream()); String str = is.readUTF(); System.out.println(str); ObjectInputStream ois = new ObjectInputStream(s.getInputStream()); User u = (User)ois.readObject(); ois.close(); System.out.println("用户ID :"+u.getID()); }catch(Exception e){ e.printStackTrace(); } ``` 异常: java.net.SocketException: Connection reset at java.net.SocketInputStream.read(Unknown Source) at java.net.SocketInputStream.read(Unknown Source) at java.net.SocketInputStream.read(Unknown Source) at java.io.DataInputStream.readUnsignedShort(Unknown Source) at java.io.DataInputStream.readUTF(Unknown Source) at java.io.DataInputStream.readUTF(Unknown Source) at com.server.EasyServer.main(EasyServer.java:24) (在os.writeUTF一行)

socket通信中;服务端瞬间write3次;客户端只read了一次;如何在客户端区分这三个数据

socket通信中;服务端瞬间write了3次;客户端只read了1次;如何在客户端区分这三个数据;已经接受的数据如何区分;

socket循环发送请求并读取响应时,循环到第二次之后就读不到响应内容

问题描述: 业务需求是有一个报文数组,我遍历该数组,每取到一个报文串,便通过socket发送至服务端处理,然后读取服务端响应的报文。但是经过反复测试,每次循环第一次的流程是正常的,但是循环到第二次之后,却读不到响应的报文(内容为空)。求各路神仙大虾帮我看看(PS:我看过网上很多的帖子,有的人说socket输入流就像一个一次性的杯子,只能使用一次。但是按这样的话,我岂不是每次发送都需要建立socket连接?这样太消耗资源了吧)。 这是我的业务逻辑代码 public void sendReq(String[] RequestXml) throws Exception{ Messenger messenger = new Messenger(SERVERIP, SERVERPORT, TIMEOUT, "UTF-8"); for (String requestXML : RequestXml) { String response = messenger.sendReq(requestXML); System.out.println(response); } messenger.close(); } 下面是我的socket发送类代码 public class Messenger { private static final Logger logger = Logger.getLogger(Messenger.class); private Socket soc; private PrintWriter pw; private BufferedReader sin; private String charset; /** * 初始化连接 * @param serverIp 连接IP * @param serverPort 连接端口 * @param timeout 超时时间 * @param charset 编码格式 * @throws Exception */ public Messenger(String serverIp, int serverPort, int timeout, String charset) throws Exception { this.soc = new Socket(serverIp, serverPort); this.charset = charset; soc.setSoTimeout(timeout); soc.setKeepAlive(true); } /** * 发送报文 * @param reqXML 待发送的报文 * @return */ public String sendReq(String reqXML) { StringBuffer responseStr = new StringBuffer(""); PrintWriter pw = null; BufferedReader sin =null; try { pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(soc.getOutputStream(), charset))); sin = new BufferedReader(new InputStreamReader(soc.getInputStream(), charset)); logger.info("【开始发送报文】"); pw.println(reqXML); pw.flush(); logger.info("【报文发送完毕】"); String str; while((str = sin.readLine()) != null) { responseStr.append(str); } logger.info("【成功读取响应报文】"); } catch(Exception e) { logger.warn("【读取响应报文时出错】" + e); } finally { if (pw != null) { pw.close(); } if (sin != null) { try { sin.close(); } catch (IOException e) {} } } return responseStr.toString(); } //关闭连接 public void close() { if (pw != null) { pw.close(); } if (sin != null) { try { sin.close(); } catch (IOException e) {} } if (soc != null) { try { soc.close(); } catch (IOException e) {} } logger.info("【关闭SOCKET连接】"); } }

socket通信发生了CONNECTION REFUSED 怎么办

package exercise; import java.io.*; import java.net.*; import java.util.*; public class clientSocket { public clientSocket() { try { InetAddress ia = InetAddress.getByName("127.0.0.1"); Socket soc = new Socket(ia,8000); InputStream is = soc.getInputStream(); InputStreamReader isr = new InputStreamReader(is); InputStreamReader user_isr = new InputStreamReader(System.in); BufferedReader user_br = new BufferedReader(user_isr); BufferedReader br = new BufferedReader(isr); OutputStream os = soc.getOutputStream(); PrintStream ps = new PrintStream(os); System.out.println("这里是客户端: "); String s; while(true) { System.out.println("输入你想要的文件: "); ps.println(user_br.readLine()); if(user_br.readLine().equals("Bye")) { break; } } soc.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String args[]) { clientSocket cs = new clientSocket(); } } package exercise; import java.net.*; import java.io.*; import java.util.*; public class serverSocket { public serverSocket() { try { ServerSocket ss = new ServerSocket(8000); Socket soc = ss.accept(); InputStream is = soc.getInputStream(); OutputStream os = soc.getOutputStream(); PrintStream ps = new PrintStream(os); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String s1; System.out.println("服务器端: "); while(true) { s1 = br.readLine(); if(s1.equals("Bye")) { break; } File f = new File(s1); if(!f.exists()) { ps.println("文件不存在"); } else if(f.exists()) { FileInputStream fis = new FileInputStream(s1); InputStreamReader ipsr = new InputStreamReader(fis); BufferedReader bfr = new BufferedReader(ipsr); ps.println(bfr.readLine()); System.out.println("文件内容已发送"); } } soc.close(); ss.close(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String args) { serverSocket SS = new serverSocket(); } }

JAVA UDP通信为什么只能接收一次数据,我想要时刻接收数据,并更新UI,大神们帮我看看程序吧?

// 与UDP数据接收线程通信更新UI线程中EditText控件中的内容 receiveHandler = new Handler() { public void handleMessage(Message msg) { point2.setText(receiveInfo); } }; } // UDP数据接收线程 public class udpReceiveThread extends Thread { @Override public void run() { try { socket = new DatagramSocket(8081); listenStatus = true; while (listenStatus) { // byte[] inBuf= new byte[1024]; byte[] inBuf = new byte[1024]; DatagramPacket inPacket = new DatagramPacket(inBuf, inBuf.length); socket.receive(inPacket); String str = new String(inPacket.getData()); receiveInfo = Change1(str, inPacket.getLength()).trim(); // receiveInfo = new String (inPacket.getData()); // receiveInfo= stringtopoint(inBuf,inPacket.getLength()); socket.close(); Message msg = new Message(); receiveHandler.sendMessage(msg); try {Thread.sleep(100); } catch (Exception e) { // TODO: handle exception } } } catch (Exception e) { e.printStackTrace(); // TODO Auto-generated catch block } } } // 发送按钮单击事件 public void SendButtonClick(View source) { new udpSendThread().start(); } // 监听按钮点击事件 public void ListenButtonClick(View source) { if (listenStatus == false) { stop.setText("停止监听"); new udpReceiveThread().start(); } else { stop.setText("开始监听"); socket.close(); listenStatus = false; new udpReceiveThread().interrupt(); } } // 数据处理 public static String Change1(String str, int len) { if (str == null || str.equals("")) { return null; } String hexString = str.replace(" ", ""); String ret = ""; char[] hexChars = hexString.toCharArray(); for (int i = 0; i < hexChars.length; i++) { if ((hexChars[i] == 'p') & (hexChars[i + 1] == '1') & (hexChars[i + 2] == 'r') & (hexChars[i + 3] == '!')) { String p = Integer .toString((CharToHex(hexChars[i + 7]) << 12) | (CharToHex(hexChars[i + 8]) << 8) | (CharToHex(hexChars[i + 9]) << 4) | CharToHex(hexChars[i + 10])); i=i+13; return p; } else { i=1+1; } } return null; } 比如我发送了p1r!p1r003B1s!p1r!p1r001A1s!,程序只处理了p1r!p1r003B1s!这句话,把我需要的003B提取出来了,更新ui,为什么不能继续处理后面的数据,继续更新ui呢?请大神赐教!

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的问题,简单的服务器程序与客户程序之间的通信

问题是这样的,我写了两个简单 的服务器程序,其中一个与一个简单的客户程序可以连续发多次信息,而另一个则不可以,发一次它就会不能继续再发了,程序并没有停止运行,而是服务器收不到它的信息了,求大侠帮忙看下啦~以下为两个服务器程序代码。因为我用的是同一个客户程序测试,所以跟client无关 吧。 //这个是可以连续发送信息的服务器 package Test20140210; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class EchoServer { private int port=8001; private ServerSocket serverSocket; public EchoServer() throws IOException{ serverSocket=new ServerSocket(port); System.out.println("Server Started ."); } public String echo(String msg){ return "echo :" +msg; } private PrintWriter getWriter(Socket socket) throws IOException{ OutputStream socketOut=socket.getOutputStream(); return new PrintWriter(socketOut,true); } private BufferedReader getReader(Socket socket) throws IOException{ InputStream socketIn=socket.getInputStream(); return new BufferedReader(new InputStreamReader(socketIn)); } public void service(){ while (true){ Socket socket=null; try{ socket=serverSocket.accept(); //等待客户连接 System.out.println("New connection accepted "+socket.getInetAddress()+" : "+socket.getPort()); BufferedReader br=getReader(socket); PrintWriter pw=getWriter(socket); String msg=null; while((msg=br.readLine())!=null){ System.out.println("NEW Line : "+msg); //在服务器程序上打印 pw.println(echo("My message : "+msg)); //在客户程序上打印 if(msg.equals("bye")) break; } }catch(IOException e){ e.printStackTrace(); } finally{ try{ if(socket!=null) socket.close(); } catch(IOException e){ e.printStackTrace(); } } } } public static void main(String[] args) throws IOException { new EchoServer().service(); } } //以下这个是不可以连续发的服务器 package Test20140221; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class EchoServer { private int port = 8001; private ServerSocket serverSocket; private ExecutorService executorService; private final int POOL_SIZE=4; public EchoServer() throws IOException{ serverSocket=new ServerSocket(port); executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE); System.out.println("numbers of CPU : "+Runtime.getRuntime().availableProcessors()); System.out.println("Server started."); } public void service(){ while(true){ Socket socket=null; try{ socket=serverSocket.accept(); executorService.execute(new Handler(socket)); }catch(IOException e){ e.printStackTrace(); } } } public static void main(String[] args) throws IOException{ new EchoServer().service(); } class Handler implements Runnable{ private Socket socket; public Handler(Socket socket){ this.socket=socket; } private PrintWriter getWriter(Socket socket) throws IOException{ OutputStream socketOut=socket.getOutputStream(); return new PrintWriter(socketOut); } private BufferedReader getReader(Socket socket) throws IOException{ InputStream socketIn=socket.getInputStream(); return new BufferedReader(new InputStreamReader(socketIn)); } public String echo(String msg){ return "echo : "+msg; } public void run(){ try{ System.out.println("New connection accepted" +socket.getInetAddress()+ " : "+socket.getPort()); BufferedReader br=getReader(socket); PrintWriter pw=getWriter(socket); System.out.println("this is Handler!"); String msg=null ; while((msg=br.readLine())!=null){ System.out.println(msg);; pw.println(echo(msg)); if(msg.equals("bye")) break; } }catch(IOException e ){ e.printStackTrace(); }finally{ try { if(socket!=null) socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }

C++ udp多线程socket实现一个server多个client间的通信

http://blog.csdn.net/chw1989/article/details/7453217 链接如上,想知道这篇文章里面提到的 能进行多机测试,但是运行的时候只能1为client,2为server并且不能实现循环处理数据,要想实现那些功能该怎么改

Socket断线重连读数据一直处于阻塞状态

最近在做一个通讯的项目,服务器每隔2s发送一个心跳包,客户端也会回一个,确认连接。 但是在客户端多次断线重连后,有一定几率会出现以下状况: 客户端与服务器成功连接,同时客户端可以接收到服务器发送的心跳包,但不发送返回包。 同时客户端任何信息都无法发送。 经过测试已知服务器在读输入流时被阻塞。 连接是用Socket获取输入输出流做的。 求问有没有谁知道问题在哪儿?

Android socket通讯客户端连不上服务器问题,以及发送消息程序就闪退

原本以为是线程问题但是好像又不是,实在找不到怎么弄了 这是客户端: package com.chiaki.mysocketobject; import android.content.Intent; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ListView; import android.widget.TextView; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.util.ArrayList; import java.util.List; public class ChatActivity extends AppCompatActivity implements Runnable{ private static final String HOST = "172.16.2.54"; private static final int PORT = 12345; private MsgAdapter adapter; private ListView msgListView; private List<Msg> msgList=new ArrayList<Msg>(); private ImageButton send; private ImageButton connect; private EditText edit; private TextView ctext; private Socket socket; private BufferedReader in = null; private PrintWriter out = null; private String content = ""; private StringBuilder sb = null; public Handler handler = new Handler() { public void handleMessage(Message msg) { if (msg.what == 0x123) { sb.append(content); ctext.setText(sb.toString()); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_chat); adapter=new MsgAdapter(ChatActivity.this,R.layout.chat_list_view,msgList); ImageButton back = (ImageButton)findViewById(R.id.back); ImageButton voiceButton = (ImageButton)findViewById(R.id.voiceButton); connect = (ImageButton)findViewById(R.id.connectButton); send = (ImageButton)findViewById(R.id.send); edit = (EditText)findViewById(R.id.edit); ctext = (TextView)findViewById(R.id.chattext); msgListView=(ListView)findViewById(R.id.msg_list_view); sb = new StringBuilder(); msgListView.setAdapter(adapter); // 点击按钮实例化Socket对象,与服务端进行连接,获取输入输出流 // 连接服务器,要在子线程中 connect.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread() { @Override public void run() { super.run(); try { // 创建socket,连接服务器 socket = new Socket(HOST, PORT);//连接服务器 in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));//接收消息的流对象 out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);//发送消息的流对象 } catch (Exception e) { e.printStackTrace(); } } }.start(); } }); back.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(ChatActivity.this,SocketActivity.class); startActivity(intent); } }); send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String con=edit.getText().toString(); edit.setText(""); if (socket.isConnected()) { if (!socket.isOutputShutdown()) { out.println(con);//点击按钮发送消息 } } } }); //启动线程,连接服务器,并用死循环守候,接收服务器发送过来的数据 new Thread(ChatActivity.this).start(); } // 重写run方法,在该方法中输入流的读取 public void run() { try { while (true) { //死循环守护,监控服务器发来的消息 if (socket.isConnected()) { //如果服务器没有关闭 if (!socket.isInputShutdown()) { //连接正常 if ((content = in.readLine()) != null) { //如果输入流没有断开 content += "\n"; //读取接收的信息 handler.sendEmptyMessage(0x123); //会发送一个空消息,但是指定了Message的what属性 } } } } } catch (Exception e) { e.printStackTrace(); } } } 这是layout文件主要的控件: <ImageButton //建立连接按钮 android:layout_width="wrap_content" android:layout_height="wrap_content" app:srcCompat="@android:drawable/checkbox_on_background" android:id="@+id/connectButton" android:layout_alignParentStart="true" android:layout_below="@+id/edit" /> <TextView //显示消息 android:text="TextView" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/chattext" /> <ImageButton //编辑消息 android:layout_width="wrap_content" android:layout_height="wrap_content" app:srcCompat="@android:drawable/ic_btn_speak_now" android:id="@+id/voiceButton" android:layout_below="@+id/edit" android:layout_centerHorizontal="true" /> <ImageButton //发送消息 android:layout_width="wrap_content" android:layout_height="40dp" app:srcCompat="@android:drawable/ic_menu_send" android:id="@+id/send" android:backgroundTint="?attr/colorButtonNormal" android:layout_alignParentBottom="true" android:layout_alignParentEnd="true" /> 这是服务端: import java.io.DataInputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { // 定义相关的参数,端口,存储Socket连接的集合,ServerSocket对象 // 以及线程池 private static final int PORT = 12345; private List<Socket> mList = new ArrayList<Socket>(); private ServerSocket server = null; private ExecutorService myExecutorService = null; public static void main(String[] args) { new Server(); } public Server() { try { server = new ServerSocket(PORT); // 创建线程池 myExecutorService = Executors.newCachedThreadPool(); System.out.println("服务端运行中...\n"); Socket client = null; while (true) { client = server.accept(); mList.add(client); myExecutorService.execute(new Service(client)); } } catch (Exception e) { e.printStackTrace(); } } class Service implements Runnable { private Socket socket; private BufferedReader in = null; private String msg = ""; public Service(Socket socket) { this.socket = socket; try { in = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println("用户:" + this.socket.getInetAddress() + "~加入了聊天室" + "当前在线人数:" + mList.size()); } catch (IOException e) { e.printStackTrace(); } } @Override public void run() { try { while (true) { if ((msg = in.readLine()) != null) { if (msg.equals("bye")) { System.out.println("~~~~~~~~~~~~~"); mList.remove(socket); in.close(); System.out.println("用户:" + socket.getInetAddress() + "退出:" + "当前在线人数:" + mList.size()); socket.close(); break; } else { System.out.println(socket.getInetAddress() + " 说: " + msg); this.sendmsg(); } } } } catch (Exception e) { e.printStackTrace(); } } // 为连接上服务端的每个客户端发送信息 public void sendmsg() { int num = mList.size(); for (int index = 0; index < num; index++) { Socket mSocket = mList.get(index); PrintWriter pout = null; try { pout = new PrintWriter( new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream(), "UTF-8")), true); pout.println(msg); } catch (IOException e) { e.printStackTrace(); } } } } }

基于JADE的多Agent远程通信问题

如有大神看到~ 可邮件联系(247843921@qq.com)~**额外加红包** 问题:最近在用JADE做Agent的远程通信,尝试了很多次,但是远程通信始终不能连通。() 具体尝试过程: 1、首先,关闭两台电脑的防火墙,联网并Ping通。 2、在Eclipse上编程,并-gui运行GUI界面。 3、添加远程平台:Add Platform via AMS AID 填写远程名称和地址。Name:ams@10.160.30.3:1099/JADE 4、填写远程名称和地址。Name:ams@10.160.30.3:1099/JADE Address:http://10.160.30.3:7778/acc 然后就提示提示:FAILURE received during GetDescription。控制台也输出以下错误信息。 因为控制台输出有:port out of range,我又多次尝试修改端口号,但是还是不行。实在是不知道怎么设置了,不知道哪位大神了解。 警告: MessageManager cannot deliver message (REQUEST sender: rma@10.160.25.80:1099/JADE ontology: FIPA-Agent-Management conversation-id: C1818492830_1509350904516) to agent ams@10.160.30.3:1099/JADE java.lang.IllegalArgumentException: port out of range:-1 at java.net.InetSocketAddress.checkPort(Unknown Source) at java.net.InetSocketAddress.<init>(Unknown Source) at java.net.Socket.<init>(Unknown Source) at javax.net.DefaultSocketFactory.createSocket(Unknown Source) at jade.mtp.http.HTTPSocketFactory.createSocket(HTTPSocketFactory.java:131) at jade.mtp.http.KeepAlive$KAConnection.open(KeepAlive.java:87) at jade.mtp.http.KeepAlive.createConnection(KeepAlive.java:248) at jade.mtp.http.KeepAlive.send(KeepAlive.java:323) at jade.mtp.http.MessageTransportProtocol.deliver(MessageTransportProtocol.java:336) at jade.core.messaging.RoutingTable$OutViaMTP.route(RoutingTable.java:109) at jade.core.messaging.MessagingService$ServiceComponent.routeOut(MessagingService.java:1608) at jade.core.messaging.MessagingService$ServiceComponent.access$5000(MessagingService.java:1471) at jade.core.messaging.MessagingService.forwardMessage(MessagingService.java:1946) at jade.core.messaging.MessagingService.deliverNow(MessagingService.java:1706) at jade.core.messaging.MessageManager$Deliverer.run(MessageManager.java:343) at java.lang.Thread.run(Unknown Source)

java关于ServerSocket.accept()的问题

我在写一个利用socket通信的程序,我在Server类(服务器类)中写一个start方法,此方法中用ServerSocket.accept()方法来监听客户机后,调用线程进入等待阶段,直到服务器响应。 现在,我在mian方法中实例化一个服务器类,调用start方法监听客户机,我想在客户机响应之前关掉socket,但由于调用start后调用线程进入了等待状态,因此在mian方法中无法继续操作。

java中TCP怎么重连,发送数据?

s = new Socket(this.getIp(),61111); pw = new PrintWriter(s.getOutputStream(),true); pw.println(str); pw.println(str2); pw.println(str3); ************************************** 上面是部分TCP。 1、我用TCP发送数据,上面有3次发送。但是假设在 pw.println(str2);时断开了连接。 我想要重新连接S(不通过new Socket(.....)),可不可以,怎么连(请写几句代码)?? 2、发送数据时pw的println()和print()有什么区别啊? 3、如果我想发送byte[]数组,该怎么弄?

基于tcp的客户端与客户端通信

刚学习的菜鸟,linux下c编写的网络通信,客户端a先给服务端发送数据,服务端接收到数据,再将接收的数据转给客户端b,现在客户端a能发给服务端,可是客户端b接不到。希望大神能帮忙解决一下。 ``` 服务器 #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <strings.h> #include <arpa/inet.h> #include <netdb.h> #include <unistd.h> #define PORT 5889 #define MAXSIZE 1024 int main(int argc,char *argv[]) { int sockfd; struct sockaddr_in server_addr; int sin_size,newfd; struct sockaddr_in client_addr; char buf[MAXSIZE]; if(argc!=2) { fprintf(stderr,"Usage:%s hostname port\a\n",argv[0]); return 1; } sockfd=socket(AF_INET,SOCK_STREAM,0); if(sockfd==-1) { fprintf(stderr,"Socket Error: %d\a\n",strerror(errno)); return 1; } memset(&server_addr,0,sizeof(struct sockaddr_in)); server_addr.sin_family=AF_INET; server_addr.sin_port=htons(PORT); server_addr.sin_addr.s_addr=htonl(INADDR_ANY); if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) { fprintf(stderr,"Bind Error: %d\a\n",strerror(errno)); return 1; } if(listen(sockfd,20)) { fprintf(stderr,"Listen Error: %d\a\n",strerror(errno)); return 1; } while(1) { errno = 0; sin_size=sizeof(struct sockaddr_in); newfd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size); if(newfd==-1) { fprintf(stderr,"Accept Error: %d\a\n",strerror(errno)); continue; } fprintf(stderr,"Server get connection from %s\n",inet_ntoa(client_addr.sin_addr)); if(fork()==0) { memset(buf,0,sizeof(buf)); if(read(newfd,buf,sizeof(buf))<1) { fprintf(stderr,"Read Error: %d\a\n",strerror(errno)); return 1; } printf ("I have received:%s\n",buf); memset(buf,0,sizeof(buf)); fgets(buf,sizeof(buf),stdin); if(write(newfd,buf,strlen(buf)+1)==-1) { fprintf(stderr,"Write Error: %d\n",strerror(errno)); return 1; } close(newfd); } newfd=-1; } close(sockfd); return 0; } ``` 客户端a ``` #include<stdlib.h> #include<stdio.h> #include<errno.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <strings.h> #include <netdb.h> #include <unistd.h> #define PORT 5889 int main(int argc,char *argv[]) { int sockfd; struct sockaddr_in server_addr; struct hostent *host; int nbytes; char buffer[1024]; if(argc!=3) { fprintf(stderr,"Usage:%s hostname port\a\n",argv[0]); return 1; } if((host=gethostbyname(argv[1]))==NULL) { fprintf(stderr,"Gethostname error\n"); return 1; } sockfd=socket(AF_INET,SOCK_STREAM,0); if(sockfd==-1) { fprintf(stderr,"Socket Error: %d\a\n",strerror(errno)); return 1; } memset(&server_addr,0,sizeof(server_addr)); server_addr.sin_family =AF_INET; server_addr.sin_port = htons(PORT); server_addr.sin_addr = *((struct in_addr *)host->h_addr); if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) { fprintf(stderr,"Connect Error:%d\a\n",strerror(errno)); return 1; } while(1) { memset(buffer,0,sizeof(buffer)); fgets(buffer,sizeof(buffer),stdin); if(write(sockfd,buffer,strlen(buffer)+1)==-1) { fprintf(stderr,"Write Error: %d\n",strerror(errno)); return 1; } memset(buffer,0,sizeof(buffer)); if(read(sockfd,buffer,sizeof(buffer))<1) { fprintf(stderr,"Read Error: %d\a\n",strerror(errno)); return 1; } printf ("I have received:%s\n",buffer); } close(sockfd); return 0; } ``` 客户端b ``` #include<stdlib.h> #include<stdio.h> #include<errno.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <strings.h> #include <netdb.h> #include <unistd.h> #define PORT 5889 int main(int argc,char *argv[]) { int sockfd,portnumber; struct sockaddr_in server_addr; struct hostent *host; int nbytes; char buffer[1024]; if(argc!=3) { fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]); return 1; } if((host=gethostbyname(argv[1]))==NULL) { fprintf(stderr,"Gethostname error\n"); return 1; } if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { fprintf(stderr,"Socket Error: %d\a\n",strerror(errno)); return 1; } memset(&server_addr,0,sizeof(server_addr)); server_addr.sin_family =AF_INET; server_addr.sin_port = htons(PORT); server_addr.sin_addr = *((struct in_addr *)host->h_addr); if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) { fprintf(stderr,"Connect Error:%d\a\n",strerror(errno)); return 1; } while(1) { memset(buffer,0,sizeof(buffer)); nbytes=read(sockfd,buffer,sizeof(buffer)); if(nbytes<1) { fprintf(stderr,"Read Error:%d\a\n",strerror(errno)); return 1; } printf("I have received:%s\n",buffer); memset(buffer,0,sizeof(buffer)); fgets(buffer,sizeof(buffer),stdin); if(write(sockfd,buffer,strlen(buffer)+1)==-1) { fprintf(stderr,"Write Error: %d\n",strerror(errno)); return 1; } } close(sockfd); return 0; } ```

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

ArrayList源码分析(入门篇)

ArrayList源码分析 前言: 写这篇博客的主要原因是,在我上一次参加千牵科技Java实习生面试时,有被面试官问到ArrayList为什么查找的速度较快,插入和删除的速度较慢?当时我回答得不好,很大的一部分原因是因为我没有阅读过ArrayList源码,虽然最后收到Offer了,但我拒绝了,打算寒假学得再深入些再广泛些,下学期开学后再去投递其他更好的公司。为了更加深入理解ArrayList,也为

我以为我学懂了数据结构,直到看了这个导图才发现,我错了

数据结构与算法思维导图

String s = new String(" a ") 到底产生几个对象?

老生常谈的一个梗,到2020了还在争论,你们一天天的,哎哎哎,我不是针对你一个,我是说在座的各位都是人才! 上图红色的这3个箭头,对于通过new产生一个字符串(”宜春”)时,会先去常量池中查找是否已经有了”宜春”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”宜春”对象的拷贝对象。 也就是说准确答案是产生了一个或两个对象,如果常量池中原来没有 ”宜春” ,就是两个。...

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

玩转springboot启动banner定义所得

最近接手了一个springboot项目,不是不熟悉这个框架,启动时打印的信息吸引了我。 这不是我熟悉的常用springboot的打印信息啊,我打开自己的项目: 还真是的,不用默认的感觉也挺高大上的。一时兴起,就去研究了一下源代码,还正是有些收获,稍后我会总结一下。正常情况下做为一个老程序员,是不会对这种小儿科感兴趣的,不就是一个控制台打印嘛。哈哈! 于是出于最初的好奇,研究了项目的源代码。看到

带了6个月的徒弟当了面试官,而身为高级工程师的我天天修Bug......

即将毕业的应届毕业生一枚,现在只拿到了两家offer,但最近听到一些消息,其中一个offer,我这个组据说客户很少,很有可能整组被裁掉。 想问大家: 如果我刚入职这个组就被裁了怎么办呢? 大家都是什么时候知道自己要被裁了的? 面试软技能指导: BQ/Project/Resume 试听内容: 除了刷题,还有哪些技能是拿到offer不可或缺的要素 如何提升面试软实力:简历, 行为面试,沟通能...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

终于懂了TCP和UDP协议区别

终于懂了TCP和UDP协议区别

你打算用Java 8一辈子都不打算升级到Java 14,真香

我们程序员应该抱着尝鲜、猎奇的心态,否则就容易固步自封,技术停滞不前。

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《经典算法案例》01-08:如何使用质数设计扫雷(Minesweeper)游戏

我们都玩过Windows操作系统中的经典游戏扫雷(Minesweeper),如果把质数当作一颗雷,那么,表格中红色的数字哪些是雷(质数)?您能找出多少个呢?文中用列表的方式罗列了10000以内的自然数、质数(素数),6的倍数等,方便大家观察质数的分布规律及特性,以便对算法求解有指导意义。另外,判断质数是初学算法,理解算法重要性的一个非常好的案例。

立即提问
相关内容推荐