请求:java写的客户端发送数据失败!!

连接时,给服务端发送数据时总是报错!!

11-28 11:15:36.164: D/MainActivity(4212): wifiname:"LcyAP_03001" prxFlag:true substr: LcyAP FirstConn:true
11-28 11:15:36.164: D/MainActivity(4212): Now Ready to create connect to LC:Now wifi stat is:SSID:"LcyAP_03001"wificonnsetat:trueSrvIp:192.168.173.1
11-28 11:15:36.164: W/System.err(4212): java.net.SocketException: Socket is closed
11-28 11:15:36.174: W/System.err(4212): at java.net.Socket.checkOpenAndCreate(Socket.java:675)
11-28 11:15:36.174: W/System.err(4212): at java.net.Socket.getOutputStream(Socket.java:415)
11-28 11:15:36.174: W/System.err(4212): at cn.LCSys.socket.TCPClient.sendMsg(TCPClient.java:104)
11-28 11:15:36.174: W/System.err(4212): at cn.LCSys.MainActivity$4.run(MainActivity.java:410)
11-28 11:15:36.174: W/System.err(4212): at java.lang.Thread.run(Thread.java:841)
11-28 11:15:38.194: D/MainActivity(4212): wifiname:"LcyAP_03001" prxFlag:true substr: LcyAP FirstConn:true
11-28 11:15:38.194: D/MainActivity(4212): Now Ready to create connect to LC:Now wifi stat is:SSID:"LcyAP_03001"wificonnsetat:trueSrvIp:192.168.173.1
11-28 11:15:38.194: W/System.err(4212): java.net.SocketException: Socket is closed
11-28 11:15:38.194: W/System.err(4212): at java.net.Socket.checkOpenAndCreate(Socket.java:675)
11-28 11:15:38.194: W/System.err(4212): at java.net.Socket.getOutputStream(Socket.java:415)
11-28 11:15:38.194: W/System.err(4212): at cn.LCSys.socket.TCPClient.sendMsg(TCPClient.java:104)
11-28 11:15:38.194: W/System.err(4212): at cn.LCSys.MainActivity$4.run(MainActivity.java:410)
11-28 11:15:38.204: W/System.err(4212): at java.lang.Thread.run(Thread.java:841)
客户端代码为:

package cn.LCSys.socket;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Reader;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

import cn.LCSys.MainActivity;
import cn.LCSys.fragment.SystemSetting;

import android.content.Intent;
import android.os.SystemClock;
import android.util.Log;

public class TCPClient {

private String TAG = "TCP Client";
private static TCPClient s_Tcp = null;
// 要连接的服务器Ip地址
private String SrvIp;
// 要连接的远程服务器在监听的端口
private int   SrvPort;
public boolean isInitialized = false;
private boolean bConnect;
Socket socket = null ;
private  long LastTickCount; 
public static synchronized TCPClient instance()
{

    if (s_Tcp == null)
    {
        {
            s_Tcp = new TCPClient(Const.SOCKET_SERVER,
            Const.SOCKET_PORT);
        }

    }
    return s_Tcp;
}

public TCPClient(String HostIp, int HostListenningPort)
{
    LastTickCount = 0;
    Log.d(TAG,"SrvIP:["+HostIp+"]SrvPort:["+HostListenningPort+"].");
    this.SrvIp = HostIp;
    this.SrvPort = HostListenningPort;
    bConnect = false;
    try
    {

        start();

    } catch (Exception e)
    {
        this.isInitialized = false;
        Log.d(TAG," TCPClient Initialize catch err!"+e.getMessage());
        e.printStackTrace();
    }
}

public static final Object locked = new Object();
public static final BlockingQueue<String> queue = new ArrayBlockingQueue<String>(
        1024 * 100);

//通过数据接收判断是否链路正常 10秒没有数据认为链路异常,进行重新连接
class EchoThread extends Thread{
    private Socket socket;
     @Override  
        public void run() {  
            while(isInitialized){  
                try {  
                    if(LastTickCount > 0)
                    {
                        //10
                         if((System.currentTimeMillis() - LastTickCount) > Const.SOCKET_TIMOUT)
                         {
                             bConnect = false;
                             LastTickCount = 0;
                         }
                    }
                    SystemClock.sleep(500);  

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

    //发送数据
    public boolean sendMsg(String sendMsg) throws InterruptedException{
        try {

            PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
            pw.write(sendMsg);
            pw.flush();
            return true;
        } catch (Exception e)
        {
            bConnect = false;
            e.printStackTrace();
            return false;
        }
        }
//}
//  接收数据的线程
class ReceiveThread extends Thread
{
    private Socket socket;
    public ReceiveThread(Socket socket)
    {
        this.socket = socket;
    }

    @Override
    public void run() 
    {
        String receivedString;  
        CharBuffer charBuffer = CharBuffer.allocate(4096);
        while(isInitialized){
            try {                   
                 Reader reader = new InputStreamReader(socket.getInputStream());
                 charBuffer.clear();
                 int index = -1;
                 while((index=reader.read(charBuffer))!=-1)
                 {
                     LastTickCount =  System.currentTimeMillis();
                     charBuffer.flip();
                    //System.out.println("client:"+charBuffer.toString());

                     Charset cs = Charset.forName("UTF-8");
                     receivedString = cs.encode(charBuffer).toString() ;    
                     int readlen = receivedString.length();
                     if( readlen > 100)
                     {  
                        //无法获取到数据
                        /*receivedString = Charset.forName("US-ASCII")
                                .newDecoder().decode(buffer).toString();*/
                        // mylcHandle.ColldataHandle(receivedString);
                         Log.d(TAG,"Read Data Length: "+readlen);

                     }
                     else
                     {
                         Log.d(TAG, "Recv len:"+readlen+" Content:"+receivedString);    

                    }

                    Intent i = new Intent(Const.BC);//广播消息,实现类之间的交互 
                    i.putExtra("response", receivedString);
                    MainActivity.s_context.sendBroadcast(i);
                   //给系统配置广播数据
                    if(null!= SystemSetting.s_context)
                    {
                        Log.d(TAG, "Broad to SystemSetting:"+readlen);  
                        SystemSetting.s_context.sendBroadcast(i);
                    }
                    //给实时数据fragement广播数据
                    /*
                    if(null!= FragmentRealData.s_context)
                    {
                        Intent ii =  new Intent(Const.DATABC);
                        ii.putExtra("response", receivedString);
                        Log.d(TAG, "Broad to FragmentRealData:"+readlen);   
                        FragmentRealData.s_context.sendBroadcast(ii);
                    }*/


                    charBuffer.clear();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

public void start() throws UnknownHostException, IOException{

     socket = new Socket(SrvIp,SrvPort);
    if(socket != null)
    {
        bConnect = true;    
        isInitialized = true;
        new ReceiveThread(socket).start();
    }
    else
    {
        bConnect = false;
    }

}
boolean isConnect()
{
    return bConnect; 
}
public void closeTCPSocket()
{
    try{
        if(socket!= null)
        {
            socket.close();
            isInitialized = false;
        }
    }
    catch(Exception ex)
    {
        Log.e(TAG,"Close Socket error!");
    }
}

// public static void main(String[] args) throws UnknownHostException, IOException {
// new TCPClient().start();
// }
}

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
JAVA的Socket为什么会自动关闭。跪了,求解
问题描述: 这里有一个服务器和一个带图形界面客户端。当的用户账号密码正确时,客户端会向服务器提出连接请求,也就是new Sicket(..., ...); 可是为什么客户端这个Socket会在成功连接7秒左右自动关闭。 我判断客户端的Socket已经关闭的原因有两个。 1.客户端的socket不停调用s.sendUrgentData方法,但在运行7秒左右时会抛出异常。 2 服务器一直在等待客户端的消息,但是在运行7秒左右服务器却抛出connection reset异常,在抛异常之前客户端可以正常发送数据,异常之后不能再发送了,在百度上知道这是因为发送方(也就是客户端)的socket已经关闭,而接收方还在等待接受而抛出的异常。 相关代码: // 客户端代码 public class LoginFrame extends JFrame { private Socket s ; if (log()) { // log是连接数据库的函数,会返回boolean表示用户名密码对不对 s = Client.requst(nameTF.getText()); // 为s赋值,将返回的Socket保存在s中, 类的静态方法requst } else { System.out.println("登陆失败"); } } // 主函数 public static void main(String[] args) throws InterruptedException { LoginFrame f = new LoginFrame(); Thread.sleep(2000);// 为了给输入用户名和密码时间 while (true) { try { f.s.sendUrgentData(0xFF); System.out.println("发送成功"); } catch (IOException e) { System.out.println("因发送心跳包出现异常" + e.getMessage()); break } } } // 客户端的连接请求代码 public class Client { public static Socket requst(String name) { Socket s = null; try { // 发出连接请求 s = new Socket("127.0.0.1", 8888); PrintWriter writer = new PrintWriter(s.getOutputStream()); // 告诉服务器是谁刚刚连接 writer.write(name + "\n"); writer.flush(); } catch (UnknownHostException e) { System.out.println(e.getMessage()); } catch (IOException e) { System.out.println(e.getMessage()); } return s; } 相关截图 客户端异常 ![图片说明](https://img-ask.csdn.net/upload/201906/16/1560659211_996428.jpg) 服务器异常(提问时,异常变成这个,但之前都是Connection reset) ![图片说明](https://img-ask.csdn.net/upload/201906/16/1560659224_174504.jpg) 请各位朋友帮忙了。 这次是JAVA课程设计,但老师并没有讲Socket,Socket的一些细节我也不清楚。所以拜托了帮我找找Bug。 ---------------------------------------------------------------------- 各位我实在是充不起C币。 要是问题解决了, 你支付宝二维码或者微信发过来, 我给你6块行不行。 拜托了,帮帮我吧。
vue前端websocket连接不上springboot,报错Connection closed before receiving a handshake response
搞定了,我的代码写的基本没有问题,毕竟都是按着教程一步一步来的,主要问题在于,我的开发环境和教程不一致,我是前后端分离,请求8080即请求的前端项目,当然会超时然后建立连接失败。我查看了一下前后端各自的端口:前端8080,后端63000,然后把 ``` this.sock = new WebSocket("ws:localhost:8080/websocket");//建立连接 ``` 改成 ``` this.sock = new WebSocket("ws:localhost:63000/websocket");//建立连接 ``` 就可以了,换成后端的端口号。 --- 以下是原问题 --- 照着网上的教程写的例子,整合到自己的项目中。前端用vue写的,js里几乎和教程一模一样,主要问题在于 ``` this.sock = new WebSocket("ws:localhost:8080/websocket");//建立连接 ``` --- **创建的websocket内的方法都是null,如图:** ![图片说明](https://img-ask.csdn.net/upload/201909/24/1569293600_266157.png) --- **然后观察控制台内过了一段时间报错,提示:** ``` WebSocket connection to 'ws://localhost:8080/websocket' failed: Connection closed before receiving a handshake response ``` --- **控制台错误详情见图:** ![图片说明](https://img-ask.csdn.net/upload/201909/24/1569294057_247788.png) --- **前端代码:** ``` webSocket() { debugger; // 建立socket连接 if ('WebSocket' in window) {//判断当前浏览器是否支持webSocket // this.sock = new WebSocket("ws:localhost:8080/bootTest/websocket");//建立连接(带后端项目名) this.sock = new WebSocket("ws:localhost:8080/websocket");//建立连接(不带后端项目名) } else { alert('你的浏览器暂不支持websocket :('); } var sock = this.sock; console.log(sock); sock.onopen = function (e) {//成功建立连接 console.log(e); }; sock.onmessage = function (e) {//接收到消息 console.log(e) $(".message").append("<p><font color='red'>"+e.data+"</font>") }; sock.onerror = function (e) {//连接发生错误 console.log(e); }; sock.onclose = function (e) {//连接关闭 console.log(e); }; ////监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。 window.onbeforeunload = function(){ websocket.close(); }; } ``` --- --- --- --- 后端代码: ``` import java.io.IOException; import java.util.concurrent.CopyOnWriteArraySet; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import javax.websocket.*; import lombok.extern.slf4j.Slf4j; @Slf4j @ServerEndpoint("/websocket") public class WebSocketServer { //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。 private static int onlineCount = 0; //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。 private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>(); //与某个客户端的连接会话,需要通过它来给客户端发送数据 private Session session; /** * 连接建立成功调用的方法*/ @OnOpen public void onOpen(Session session) { this.session = session; webSocketSet.add(this); //加入set中 addOnlineCount(); //在线数加1 log.info("有新连接加入!当前在线人数为" + getOnlineCount()); try { sendMessage("连接成功"); } catch (IOException e) { log.error("websocket IO异常"); } } // //连接打开时执行 // @OnOpen // public void onOpen(@PathParam("user") String user, Session session) { // currentUser = user; // System.out.println("Connected ... " + session.getId()); // } /** * 连接关闭调用的方法 */ @OnClose public void onClose() { webSocketSet.remove(this); //从set中删除 subOnlineCount(); //在线数减1 log.info("有一连接关闭!当前在线人数为" + getOnlineCount()); } /** * 收到客户端消息后调用的方法 * @param message 客户端发送过来的消息 */ @OnMessage public void onMessage(String message, Session session) { log.info("来自客户端的消息:" + message); //群发消息 for (WebSocketServer item : webSocketSet) { try { item.sendMessage(message); } catch (IOException e) { e.printStackTrace(); } } } /** * 发生错误 * @param session * @param error */ @OnError public void onError(Session session, Throwable error) { log.error("发生错误"); error.printStackTrace(); } public void sendMessage(String message) throws IOException { this.session.getBasicRemote().sendText(message); } /** * 群发自定义消息 * */ public static void sendInfo(String message) throws IOException { log.info(message); for (WebSocketServer item : webSocketSet) { try { item.sendMessage(message); } catch (IOException e) { continue; } } } public static synchronized int getOnlineCount() { return onlineCount; } public static synchronized void addOnlineCount() { WebSocketServer.onlineCount++; } public static synchronized void subOnlineCount() { WebSocketServer.onlineCount--; } } ```
kafka1.0.0的client,生产者生产数据失败
配置: ``` Properties props = new Properties(); //broker地址 props.put("bootstrap.servers", "39.108.61.252:9092,39.108.61.252:9093,39.108.61.252:9094"); //请求时候需要验证 props.put("acks", "0"); //请求失败时候需要重试 props.put("retries", 1); //生产者就会尝试将记录组合成一个batch的请求。 这有助于客户端和服务器的性能。不能大于此默认值,否则浪费内存,反而降低吞吐量 //props.put("batch.size", 16384); //汇聚一定时间内的记录一起发出 // props.put("linger.ms", 50); //内存缓存区大小 props.put("buffer.memory", 33554432); //指定消息key序列化方式 props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); //指定消息本身的序列化方式 props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); producer = new KafkaProducer<>(props); ``` 生产数据 没有Thread.sleep()就不能成功发送数据!,有了就可已在消费者端接受到数据。若把Thread.sleep()删除,在生产末尾加上close()方法也能成功生产 ``` for (int i = 0; i < 10; i++) { try { Thread.sleep(50); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } kafkaProducer.send(new ProducerRecord<>("topic_user_general_info_update", "simpleKey", "value-"+i)); } ``` 困扰很久,不知道配置还是哪里问题。
关于httpclient传送和接收数据的问题!!!!急~急~急~
&nbsp; 现要求,客户端向服务端以httpclient的post方式发送“XML格式的字符串”,服务器接收字符串数据,解析之后返回“XML格式的字符串”给客户端。 <br />&nbsp; <pre name="code" class="java"> String url="http://localhost:8080/smartHN/regist/regist.action?method=userReg"; HttpClient hc = new HttpClient(); PostMethod post = new PostMethod(url); post.setRequestBody ("&lt;xml&gt;&lt;name&gt;long&lt;/name&gt;&lt;age&gt;24&lt;/age&gt;&lt;address&gt;wuhan&lt;/address&gt;&lt;/xml&gt;"); try { int state = hc.executeMethod(post); if(state!=HttpStatus.SC_OK){ System.out.println("远程访问失败!"); } System.out.println(post.getResponseBodyAsString());//反馈结果 } catch (HttpException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }</pre> <br /> <br />这是模拟客户端发送请求,代码可能存在问题~~ <br />请教服务端action怎么接收这个XML字符串,希望详细一点~~~~~感谢!<br/><strong>问题补充</strong><br/>post.addParameter(new NameValuePair("xml","******")); <br /> <br />服务端通过request.getParameter("xml");是可以接收的。 <br />我想知道还可以通过别的方式传递吗? <br />1、比如放在一个content里面或body里面,是怎么实现? <br />2、服务端接收数据之后进行处理之后返回客户端一个XML字符串,又是怎么实现?&nbsp;&nbsp;
怎么连接gps发送第一个注册包,这个xml格式怎么写
1概述 1.1术语表 本协议用到以下术语: 术语 全称 描述 GPSBS GPS Business Server GPS业务服务器 GPSMT GPS Monitor System GPS监控终端 XML Extensible Markup Language 可扩展标记语言 1.2协议说明 GPSP协议以TCP/IP作为底层通信承载,具体堆栈结构由(图一)所示: 1.3适用范围 本协议适用于GPSBS与GPSMT之间的消息通讯。 2通信方式 GPSMT做为客户端,GPSBS做为服务端。当客户端要发送命令时,主动向服务器端建立TCP长连接,然后向服务器端发送命令,并接收应答;服务器端从客户端接收命令,返回应答。连接建立以后,客户端可以连续发送多条命令。客户端由于某种原因需要暂时中断通讯,客户端应该发起注销消息,收到返回后主动断开连接。 当信道上没有业务数据传输时,客户端/服务端应每隔时间30秒发送链路检测包以维持此连接, 服务端/客户端收到链路检测包后,立即返回链路检测应答包。服务端/客户端在120秒内没有收到任何消息包,则应断开此连接。 由于某种原因导致连接断开,客户端应尝试重新连接,才能继续发送业务数据包。 2.1连接服务器 客户端连接指定服务器上的端口,建立TCP/IP层上的长连接。 2.2注册通信 在已经连接服务器的基础上,向服务器端注册自己的身份。 注册通信是所有业务数据包发送之前发送的第一个数据包。它由客户端发送登陆名与密码到服务器,服务器根据注册包中的登陆名与密码,对客户端的合法性进行验证,然后返回注册消息返回包给客户端。如果验证通过,则客户端与服务器就可以进行后面的业务数据的通讯,否则断开TCP/IP连接 2.3通信过程 2.3.1 GPSMT、GPSMP发起的消息 2.3.2 GPSBS发起的消息 2.4注销通信 客户端向服务端发起请求断开连接,服务器端收到请求返回一个注销应答,当客户端收到应答后,关闭此连接。 2.5关闭连接 断开TCP/IP层的连接。 2.6通信异常处理 如果服务器端接收到的命令语法错误,比如命令不完整、命令无法识别等,则断开和客户端的连接;客户端应该向服务器端建立新连接继续发送命令。 如果客户端接收到的应答语法错误,比如命令不完整、命令无法识别等,则主动断开和服务器端的连接;服务器端也应该断开和客户端的连接。 如果命令语法正确,但服务器端不处理该命令,则返回相应应答,并在应答中指定错误原因。 如果应答语法正确,但客户端不处理该应答,则丢弃。 2.7连接故障处理 客户端与服务器端的通信过程中,如果由于线路或其他原因导致TCP/IP连接断开,客户端应尝试重连。 3消息定义 3.1消息中数据类型 类型 说明 Unsigned Integer 无符号整数, 采用网络字节顺序 Text 字符串 (表一)消息的数据类型 注:消息说明中的长度指占用字节数。 3.2消息组成 基于TCP/IP连接上GPSP协议消息分为消息头与消息体两部分。 项目 说明 消息头 消息头部分 消息体 消息体部分 (表二)消息的组成 消息头分为同步头、消息长度、消息类型三部分: 项目 类型 长度 说明 取值 同步头 Text 4 为检测每个包的起始位置 “^#~>” 消息长度 Unsigned Integer 4 整个消息头与消息体的长度 消息类型 Unsigned Integer 4 表示此消息的类型 参见【常量定义】中的消息类型定义 (表三)消息头的组成 消息体是由格式良好的XML组成。此XML的根元素必须是<ROOT>;业务请求消息包中必须包含<FUNCODE>(功能码)和<TRACE >(序列号),业务请求应答包必须包含<RETCODE>(返回码)和<TRACE >(序列号)。具体消息定义参见下面消息体描述。 序列号(TRACE)由“MMDDHHmmss”+四位流水号(从0000到9999),长度为14位,能保证一年不重复,如“06241304350345”,表示6月24日13点04分35秒第345个包。 注:以下描述中元素值全为Text类型;所标长度为最大长度(不足长度的不用补其他字符);本文档XML中的汉字为元素值的中文描述。 3.3消息体描述 3.3.1注册消息 注册消息是校验监控终端的合法性。为了不在注册消息中传送明文用户名和明文密码,采用校验GPSBS分配的用户名与密码摘要的方式实现。 <?xml version="1.0" encoding="GB2312" standalone="no"?> <ROOT> <TRACE>序列号</TRACE> MERCID<>ERP代码</MERCID> <USERNAME> 用户名</USERNAME> <PASSWORD >用户密码摘要base64编码</PASSWORD> </ROOT> 元素名 重要性 元素值长度 元素值描述 TRACE 必须 14 序列号 MERCID 必须 8 ERP代码 USERNAME 必须 28 由GPSBS提供的登陆用户名 PASSWORD 必须 28 由GPSBS提供的登陆密码MD5摘要的base64编码,用来检测接入的合法性 3.3.2注销消息 <?xml version="1.0" encoding="GB2312" standalone="no"?> <ROOT> <TRACE>序列号</TRACE> </ROOT> 元素名 重要性 元素值长度 元素值描述 TRACE 必须 14 序列号 3.3.3探测包消息 <?xml version="1.0" encoding="GB2312" standalone="no"?> <ROOT> <TRACE>序列号</TRACE> </ROOT> 元素名 重要性 元素值长度 元素值描述 TRACE 必须 14 序列号 3.3.4业务请求消息 <?xml version="1.0" encoding="GB2312" standalone="no"?> <ROOT> <TRACE>序列号</TRACE> <TRANSFLAG>传送方向</TRANSFLAG> <FUNCODE>功能码</FUNCODE> <!—其他元素待定 </ROOT> 元素名 重要性 元素值长度 元素值描述 TRACE 必须 14 序列号 TRANSFLAG 必须 2 ‘00’服务端请求;’10’客户端请求 FUNCODE 必须 8 功能码,取值参见【常量定义】中的业务请求/应答功能码定义 必须 其他元素,参见下面的具体业务 3.3.5注册应答消息 <?xml version="1.0" encoding="GB2312" standalone="no"?> <ROOT> <TRACE>序列号</TRACE> <RETCODE>返回码</RETCODE> <ERRDESC>失败原因</ERRDESC> </ROOT> 元素名 重要性 元素值长度 元素值描述 TRACE 必须 14 消息序列号原样返回 RETCODE 必须 1 注册消息返回值,返回码参见【常量定义】中的返回码定义 ERRDESC 可选 100 失败原因 3.3.6注销应答消息 <?xml version="1.0" encoding="GB2312" standalone="no"?> <ROOT> <TRACE>序列号</TRACE> </ROOT> 元素名 重要性 元素值长度 元素值描述 TRACE 必须 14 消息序列号原样返回 3.3.7探测包应答消息 <?xml version="1.0" encoding="GB2312" standalone="no"?> <ROOT> <TRACE>序列号</TRACE> </ROOT> 元素名 重要性 元素值长度 元素值描述 TRACE 必须 14 消息序列号原样返回 3.3.8业务请求应答消息 <?xml version="1.0" encoding="GB2312" standalone="no"?> <ROOT> <TRACE>序列号</TRACE> <TRANSFLAG>传送方向</TRANSFLAG> <FUNCODE>功能码</FUNCODE> <RETCODE>返回码</RETCODE> </ROOT> 元素名 重要性 元素值长度 元素值描述 TRACE 必须 14 序列号 TRANSFLAG 必须 2 ’01’服务端应答;’11’客户端应答 FUNCODE 必须 8 业务请求功能码原样返回 RETCODE 必须 8 业务请求消息返回码,参见【常量定义】中的返回码定义 4常量定义 5.1服务端口定义 服务器名称 服务器IP 服务端口 客户端名称 5.2消息类型定义 消息名称 消息取值(十六进制) 注册消息 0x00000001 注册应答消息 0x10000001 注销消息 0x00000002 注销应答消息 0x10000002 探测消息 0x00000003 探测消息应答 0x10000003 业务请求消息 0x00000004 业务请求应答消息 0x10000004 (表五)消息类型定义 5.3返回码定义 错误码 描述 0 无错误,命令正确接收 1 非法登录,如登录名、口令出错、登录名与口令不符等。 2 非法源地址 3 连接过多,指单个节点要求同时建立的连接数过多。 4 设备ID重复登录 5 参数格式错误 7 设备ID不存在 8 设备ID已经存在 9 对应移动终端SIM卡号不存在 10 对应移动终端SIM卡号已经存在 其他 待定 (表六)返回码定义
servlet 怎么把数据库查到的东西传到HTML中
下面是我写的,不知道该怎么改了。。 package servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Date; public class Servlet1 extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取客户端发送的请求类型:GET/POST doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub String responseBody = "Current request method is <B>:" + request.getMethod() + "</B> <br>" + new Date(); // 将所有HTML响应数据通过网络回发到客户端。 // 获取发送响应的PrintWriter对象 PrintWriter out = response.getWriter(); // 装在需要响应到客户端的响应数据 out.println(responseBody); try{ Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //注册JDBC驱动 Connection con=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=Stu_Man","sa","13361775956"); //链接数据库 System.out.println("连接成功!"); //如果连接成功,控制台输出“连接成功!” //查询数据 String str2= "select Course.couid,counam, coutimes, couroom, courtea from Course,Student,Score where stunam ='张三' and Student.stuid=Score.stuid and Score.couid=Course.couid"; Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(str2); response.setContentType("text/html;charset=utf-8"); while (rs.next()) { String a = rs.getString("couid"); String b = rs.getString("counam"); String c = rs.getString("coutimes"); String d = rs.getString("couroom"); String e = rs.getString("courtea"); out.print("<td><input type=\"checkbox\" name=\"id\" value=\""+a+"\"></td>"); out.print("<td>"+b+"</td>"); out.print("<td>"+c+"</td>"); out.print("<td>"+d+"</td>"); out.print("<td>"+e+"</td>"); out.print("</tr>"); } out.print("</table></center>"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); //插入数据 String str1 = "insert into Student values(107,'王九','男','95-05-02','技术4')"; Statement stm = con.createStatement(); int res= stm.executeUpdate(str1); if (res > 0) { System.out.println("数据已成功插入!"); } //删除数据 PreparedStatement p = null; try { String str3 = "delete from Student where stunam ='王' "; p = con.prepareStatement(str3); int row = p.executeUpdate(); System.out.println("成功删除了"+row+"行数据!"); } catch (SQLException sqlE) { sqlE.printStackTrace(); } if (rs != null) { con.close(); //释放资源 } } catch (SQLException e) { // e.printStackTrace(); System.out.println("数据执行错误!"); } catch(Exception e) { System.out.println("连接失败!"); } // 发送响应 out.close(); } }
关于WebSocket的问题 为什么浏览器关闭后会出一下异常
错误信息 ```java.net.SocketException: Software caused connection abort: recv failed at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:129) at java.net.SocketInputStream.read(SocketInputStream.java:90) at test.UserSocket.run(UserSocket.java:43) java.net.SocketException: Software caused connection abort: recv failed at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:129) at java.net.SocketInputStream.read(SocketInputStream.java:90) at test.UserSocket.run(UserSocket.java:43) ``` 这是一个WebScoket 的小测试。我开了3个浏览器测试正常后,关闭其中一个就会这个异常以下是我的代码麻烦各位大神给看看 ``` package test; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; import sun.applet.Main; public class ServerSocketTest { public static List<Socket> clientSocket = new ArrayList<Socket>(); public ServerSocketTest() throws IOException{ ServerSocket ss = new ServerSocket(30000); System.out.println("服务器启动等待客户端连接"); while(true){ Socket s =ss.accept();//等待客户端连接 clientSocket.add(s); System.out.println("客户端总人数"+clientSocket.size()); //为新用户启动线程 new UserSocket(s).start(); } } public static void main(String[] args) throws IOException { new ServerSocketTest(); } } ``` 下面是线程代码 ``` package test; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.SocketException; import java.security.MessageDigest; import java.util.Iterator; import java.util.regex.Matcher; import java.util.regex.Pattern; import sun.misc.BASE64Encoder; public class UserSocket extends Thread{ private Socket socket; public UserSocket(Socket socke){ this.socket = socke; } @Override public void run() { try { InputStream is = socket.getInputStream();//获取用户输入流 OutputStream ops = socket.getOutputStream();//获取用户输出流 byte[] buff = new byte[1024];//字节 String red = ""; //用了存放客户端请求过来的内容(客户端信息) // 读取数据,此时建立与wabSocket的握手 int count = is.read(buff);//读取客户端请求内容的长度 if(count > 0){ //客户端请求数据转化字符串 red = new String(buff,0,count); //获取WebSocket的值 String seckey = getSecWebSocketKey(red); String response = "HTTP/1.1 101 Switching Protocols\r\nUpgrade: " + "websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: " + getSecWebSocketAccept(seckey) + "\r\n\r\n"; //推送向客户端 ops.write(response.getBytes("utf-8")); int hasRedad = 0; // 不断读取WebSocket发送过来的数据 System.out.println("while循环前,等待前端推送数据。。。。。。。。。。。。"); while((hasRedad = is.read(buff))>0){//判断循环读取 System.out.println("后台接收到值,进入While循环处理"); /* * 因为WebSocket发送过来的数据遁寻了一定的协议格式, 其中第3~6个字节是数据掩码, * 从第七个字节开始才是真正的有效数据。 因此程序使用第3~6个字节对后面的数据进行了处理 */ for (int i = 0; i < hasRedad - 6; i++) { buff[i + 6] = (byte) (buff[i % 4 + 2] ^ buff[i + 6]); } //获得从浏览器发送过来的数据 String pushMsg = new String(buff,6,hasRedad - 6, "utf-8");//第一个值要读取的字节,从第几个开始读取,字符串的总长度,字符集 //便利Socket集合,向每个Socket对象发送信息 for (Iterator<Socket> it = ServerSocketTest.clientSocket.iterator();it.hasNext(); ) { try { Socket s = it.next(); byte[] pushHead = new byte[2]; pushHead[0] = buff[0]; pushHead[1] = (byte) pushMsg.getBytes("utf-8").length; //发送前两个字节 s.getOutputStream().write(pushHead); //发送有效数据 s.getOutputStream().write(pushMsg.getBytes("utf-8")); } catch (SocketException e) { //如果捕获到异常将其从集合中删除 // 如果捕捉到异常,表明该Socket已经关闭 it.remove(); } } } } } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); }finally{ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } // 获取WebSocket请求的Seckey private String getSecWebSocketKey(String req) { // 构建正则表达式,获取Sec-WebSocket-Key:后面的内容 Pattern p = Pattern.compile("^(Sec-WebSocket-Key:).+", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE); Matcher m = p.matcher(req); if (m.find()) { // 提取Sec-WebSocket-Key String foundstring = m.group(); return foundstring.split(":")[1].trim(); } else { return null; } } // 根据WebSocket请求的Seckey计算SecAccept private String getSecWebSocketAccept(String key) throws Exception { String guid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; key += guid; MessageDigest md = MessageDigest.getInstance("SHA-1"); md.update(key.getBytes("ISO-8859-1"), 0, key.length()); byte[] shalHash = md.digest(); BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(shalHash); } } ``` 刚才又调试了几次,发现了一些新的东西。 同时开启多个页面进行程序测试。当其中一个页面关闭时,这个页面向后台发送了一条数据,后台接收后处理并发送给其他页面。但是这个页面关闭了,本线程下发送给其他页面的信息全部发送失败。由于发送信息发送不出去,本线程就在此处 ``` } catch (SocketException e) { //如果捕获到异常将其从集合中删除 // 如果捕捉到异常,表明该Socket已经关闭 it.remove(); } ``` 把其他的Socket对象全部删除了,导致所有的Socket对象连接都断开了。求教大神们有没有什么靠谱的解决办法
springMVC中使用websocket报错404
![图片说明](https://img-ask.csdn.net/upload/201612/01/1480567442_423163.png) ## 似乎是springmvc拦截了ws请求,怎么才能让springMVC不拦截WS呢 JS代码 ``` var websocket = null; //判断当前浏览器是否支持WebSocket if('WebSocket' in window){ websocket = new WebSocket("ws://localhost:8080/VM2.0/websocket"); } else{ alert('浏览器不支持websocket,请更换浏览器'); }; //连接发生错误的回调方法 websocket.onerror = function(){ console.log("websocket连接失败"); }; //连接成功建立的回调方法 websocket.onopen = function(event){ console.log("websocket连接成功"); }; ``` java代码 ``` //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。 private static int onlineCount = 0; //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识 private static CopyOnWriteArraySet<MySocket> webSocketSet = new CopyOnWriteArraySet<MySocket>(); //与某个客户端的连接会话,需要通过它来给客户端发送数据 private Session session; /** * 存储当前有效的session对象 */ private static Queue<Session> sessionSet = new ConcurrentLinkedQueue<Session>(); /** * 连接建立成功调用的方法 * @param session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据 */ @OnOpen public void onOpen(Session currentSession){ if(sessionSet.contains(currentSession) == false){ sessionSet.add(currentSession); System.out.println("WebSocketTest.onOpen()================Add=" + sessionSet.size()); } System.out.println("Server say:Client connected"); } ```
java web 怎么给安卓手机客户端提供接口? 开发文档不懂 跪求解决方法
------------------------------------------------------- 用到的框架 spring+springMVC+myBatis 数据库 mysql 开发工具 eclipse 实现手机 注册 和登录 以及获取手机用户个人信息功能 ---------------------------------------------------- 这是开发文档 可供参考,真的不知道该从哪里入手 1、用户注册 参数名称 参数说明 长度要求 可选/必须 phone 用户注册的手机号 必须 password 用户密码(md5加密) 必须 code 手机验证码 6 必须 rndstring 随机字符串 32 必须 返回值说明 1.{"res":"1001"} 注册成功 2.{"res":"1002"} 手机被占用 3.{"res":"1003"} 验证码已经过期 4.{"res":"1004"} 验证码无效 5.{"res":"1005"} 重复提交 6.{"res":"1006"} 缺少参数 2、用户登录 参数名称 参数说明 长度要求 可选/必须 m 值为0x5702 必须 phone 用户手机号 可选 name 用户名 可选 password 用户密码(md5加密) 必须 rndstring 随机字符串 32 必须 注:phone 和name 必选一个 返回值说明 1.{"res":"1001","mid":51,"name":"cheihcheung","ident_code":"abcdc3949ba59abbe56e057f20f88fd"}登录成功 2.{"res":"1002"} 帐号或密码输入有误,登录失败 3.{"res":"1003"} 缺少参数 4.{"res":"1005"} 重复请求 3、获取手机验证码 参数名称 参数说明 长度要求 可选/必须 m 值为0x5704 必须 phone 手机号 11 必须 type 验证码类型 可选 rndstring 随机字符串 32 必须 注:验证码类型type=0代表注册,type=1代表找回密码,可不传,默认为0, 返回值说明 1.{"res":"1001"} 发送成功 2.{"res":"1002"} 手机被占用 3.{"res":"1003"} 缺少手机号 4.{"res":"1004"} 参数错误 5.{"res":"1005"} 重复请求 6.{"res":"1006"} 却少随机字符串 4、修改密码 参数名称 参数说明 长度要求 可选/必须 m 值为0x5703 必须 phone 用户手机号 必须 code 验证码 必须 password 用户密码(md5加密) 必须 返回值说明 1.{"res":"1001"} 修改成功 2.{"res":" 1002"} 验证码过期 3.{"res":"1003"} 验证码无效 4.{"res":"1004"} 缺少参数, 5、查询个人资料 参数名称 参数说明 长度要求 可选/必须 uid 用户编号 必须 返回值说明 1. {"res":" 1002"} 缺少ID 正确结果: {"id":"315","account":"18315443","phone":"21","head":"","name":"前往","age":"21","height":"0","weight":"0.00","gender":"1","relation":"","nickname":""}
通过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)
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?"连接成功":"连接失败"); } } ```
objectinputstream readobject 为何只能读取第一次写入的值
public class TransEntity implements Serializable//传输信息实体封装类 { private static final long serialVersionUID = 1L; private String operaType;//用户操作类型;如发送文本消息,发送语音消息,发送音频消息 private String responseTags;//网络响应状态;如“登录成功”、“登录失败”、“注册成功”、“注册失败” private String requestTags;//网络请求标记;请求发送文本消息,语音消息,音频消息 private User sender;//发送方; private User receiver;//接收方; private ArrayList<HashMap<String,Object>> buddylist;//好友列表信息; private String time;//系统时间; private ArrayList<HashMap<String,String>> inputGeneralMsgList;//通用信息 private HashMap<String,Object> outGeneralMsgMap; private String path; public String getUserOperaType() { return operaType; } public void setUserOperaType(String operaType) { this.operaType = operaType; } public String getResponseTags() { return responseTags; } public String setResponseTags(String responseTags) { return this.responseTags = responseTags; } public void setRequestTags(String requestTags) { this.requestTags = requestTags; } public String getRequestTags() { return requestTags; } public User getSender() { return sender; } public void setSender(User sender) { this.sender = sender; } public User getReceiver() { return receiver; } public void setReceiver(User receiver) { this.receiver = receiver; } public ArrayList<HashMap<String,Object>> getList() { return buddylist; } public void setList(ArrayList<HashMap<String,Object>> buddylist) { this.buddylist = buddylist; } public String getImagePath() { return path; } public void setImagePath(String path) { this.path = path; } public void setGeneralMessagefrom(ArrayList<HashMap<String,String>> inputGeneralMsgList) { this.inputGeneralMsgList = inputGeneralMsgList; } public ArrayList<HashMap<String,String>> getGeneralMessagefrom() { return inputGeneralMsgList; } public void setGeneralMessageto(HashMap<String,Object> outGeneralMsgMap) { this.outGeneralMsgMap = outGeneralMsgMap; } public HashMap<String,Object> getGeneralMessageto() { return outGeneralMsgMap; } public void setSysTime(String time) { this.time = SysTime.getDateTime(); } public String getSysTime() { return time; } } 服务端核心代码 public class ServerThread extends Thread { private static ObjectInputStream ois = null; private static ObjectOutputStream oos = null; private ArrayList<HashMap<String,Object>> list = null; private ArrayList<HashMap<String,String>> outgeneralMsgList = null; private Socket socket = null; private TransEntity trans = null; private boolean FLAGS_IsFirstLogin = true; private boolean FLAGS_LoginSucess = false; private boolean FLAGS_RegisterSucess = false; private boolean FLAGS_OnLine = false; private User user = null; private User receiver = null; private Timer timer = new Timer(); public ServerThread(Socket socket) { this.socket = socket; try { oos = new ObjectOutputStream(socket.getOutputStream()); ois = new ObjectInputStream(socket.getInputStream()); } catch (IOException e) { e.printStackTrace(); } } public void run() { try { while(true) { if(socket.isClosed() == false && socket.isConnected() == true) { try { if(ois!=null) { trans = (TransEntity) ois.readObject(); } } catch(java.net.SocketException e) { System.out.println("客户端已经关闭。。。。。。。"); break; } catch(ClassNotFoundException e) { System.out.println("--------空指针异常---------"); } catch(java.io.EOFException e) { System.out.println("客户端已经关闭。。。。。。。"); } } if(trans!=null) { user = trans.getSender(); receiver = trans.getReceiver(); if(trans.getUserOperaType()!=null) { System.out.println("----------trans.getUserOperaType() :------------"+(trans.getUserOperaType())); if(FLAGS_IsFirstLogin == true&&(UserOperaType.LOGIN.equals(trans.getUserOperaType()))) { //首次登录,一般情形下的客户端发过来的登录操作请求做处理,非掉线后的自动登录; System.out.println("--------server---socket :------"+(socket)); FLAGS_LoginSucess = setLogin(); } if(FLAGS_LoginSucess) { FLAGS_IsFirstLogin = false; System.out.println("----------trans.getUserOperaType() :------------"+(trans.getUserOperaType())); ......为何此次只能输出第一次读入的数据 if(UserOperaType.SEND_MESSAGE.equals(trans.getUserOperaType())) { System.out.println("-------UserOperaType.SEND_MESSAGE ---------"); System.out.println(trans.getGeneralMessageto().get("outMsg").toString()); if(trans.getGeneralMessageto()!=null)//若getGeneralMessageto()返回值不为空,则可以向数据库写入信息; { System.out.println("-------服务端:---发送方 写入普通信息到数据库,如文字消息;-----------"); SysCtlVar.dbBasicOperation.writeGeneralMessage(trans);// 发送方 写入普通信息到数据库,如文字消息; //trans.setGeneralMessageto(null); } trans.setUserOperaType(null); } oos.writeObject(trans); oos.flush(); } } } } } catch (Exception e) { e.printStackTrace(); } finally { } } } 客户端核心代码 while(SysCtlVar.FlAGS_LoginSuccess) { // System.out.println("--------------while SysCtlVar.FlAGS_LoginSuccess -------------"); try { try { SysCtlVar.trans = (TransEntity)SysCtlVar.ois.readObject(); if(SysCtlVar.inputGeneralMsgList!=null) synchronized(SysCtlVar.inputGeneralMsgList) { SysCtlVar.inputGeneralMsgList = SysCtlVar.trans.getGeneralMessagefrom(); SysCtlVar.inputGeneralMsgList.notify(); } synchronized(SysCtlVar.outGeneralMsgMap) { try { System.out.println("------- SysCtlVar.outGeneralMsgMap.wait----------"); SysCtlVar.outGeneralMsgMap.wait(); //等待直到有输入的时候,才把消息发送出去 System.out.println("---------------客户端: 正在发送消息。。。。。。------------------"); System.out.println("------- SysCtlVar.outGeneralMsgMap:----------"+(SysCtlVar.outGeneralMsgMap.get("outMsg").toString())); SysCtlVar.trans.setUserOperaType(UserOperaType.SEND_MESSAGE); SysCtlVar.trans.setGeneralMessageto(SysCtlVar.outGeneralMsgMap); System.out.println("------- SysCtlVar.trans.getGeneralMessageto():----------"+(SysCtlVar.trans.getGeneralMessageto().get("outMsg").toString())); try { SysCtlVar.oos.writeObject(SysCtlVar.trans); SysCtlVar.oos.flush(); } catch (IOException e) { e.printStackTrace(); } } catch (InterruptedException e) { e.printStackTrace(); } } } catch (ClassNotFoundException e) { e.printStackTrace(); } } catch (StreamCorruptedException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } } } 客户端 数据输入部分 /** 调试过程中,你将看到客户端输入的消息为h(第一条消息),www(第二条消息),a(第三条消息) 但是服务端只有第二条消息的值; */ //------------------发送消息 ---------- //客户端当前会话任务中,选中的消息接收者; new Thread() { public void run() { synchronized(SysCtlVar.outGeneralMsgMap) { System.out.println("------- 客户端:正在输入要发送的消息----------"); SysCtlVar.outGeneralMsgMap.clear(); SysCtlVar.outGeneralMsgMap.put("outMsg",outMsg); SysCtlVar.outGeneralMsgMap.put("msgRecver", selectedAccount); SysCtlVar.outGeneralMsgMap.put("dateTime",SysTime.getDateTime().toString()); SysCtlVar.outGeneralMsgMap.notify(); //输入完毕,通知发送任务执行 } } }.start(); 调试信息(服务器端) 服务器已启动,正在监听1345端口 ----------trans.getUserOperaType() :------------0 --------server---socket :------Socket[addr=/127.0.0.1,port=38516,localport=1345] ------- list!=null : ---------true [qq]上线了! ----------qq---------- ----------trans.getUserOperaType() :------------0 ----------trans.getUserOperaType() :------------6 ----------trans.getUserOperaType() :------------6 -------------UserOperaType.GET_AVATARS------------6 我想从服务器获取头像 ----------trans.getUserOperaType() :------------7 ----------trans.getUserOperaType() :------------7 -------UserOperaType.SEND_MESSAGE --------- www -------服务端:---发送方 写入普通信息到数据库,如文字消息;----------- insert into chat(sender,recver,message,sendtime) values('qq','在水一方','www','2015-04-24 16:15:13') ----------trans.getUserOperaType() :------------7 ----------trans.getUserOperaType() :------------7 -------UserOperaType.SEND_MESSAGE --------- www -------服务端:---发送方 写入普通信息到数据库,如文字消息;----------- insert into chat(sender,recver,message,sendtime) values('qq','在水一方','www','2015-04-24 16:15:13') ----------trans.getUserOperaType() :------------7 ----------trans.getUserOperaType() :------------7 -------UserOperaType.SEND_MESSAGE --------- www -------服务端:---发送方 写入普通信息到数据库,如文字消息;----------- insert into chat(sender,recver,message,sendtime) values('qq','在水一方','www','2015-04-24 16:15:13') ----------trans.getUserOperaType() :------------7 ----------trans.getUserOperaType() :------------7 -------UserOperaType.SEND_MESSAGE --------- www -------服务端:---发送方 写入普通信息到数据库,如文字消息;----------- insert into chat(sender,recver,message,sendtime) values('qq','在水一方','www','2015-04-24 16:15:13') ---------------问题补充--------------- 单步调试,客户端的输出流正确发送了每一次的客户端输入数据(36分钟前)删除 对于单步调试追踪的结果:客户端每一次发送的trans(它是TransEntity的实例,被序列化的消息实体对象)都是正确的(即,与客户端输入值相同)。但是服务端有ObjectInputStream读入的trans(它也是TransEntity的实例,被序列化的消息实体对象)却没有改变始终是第一次的值
关于Socket(telnet)(websocket)远程连接的疑问
大家好! 目前小弟在做一个连接远程控制台读取返回信息输出页面的小程序(可以称之为游戏服务端控制台那种), 连接控制台信息: 远程端口、ip、密码 描述: 1.websocket 1.1这种js里面直接用ws协议连接ws://localhost:本地端口/"+ip+"/"+port+"/"+passwd这样连接会握手失败,由于没去看过源码,暂且判定为是因为(连接控制台第一件事是输入密码登陆这个我不知道他会不会自动发送密码先登录然后接受信息) 1.2,由于上一种方法行不通,那我就用ws协议请求java项目里面的websocket,在用socket连接远程,这样连接控制台然后手动发送密码,在读取控制台一直返回的信息,但是这里遇到一个问题,服务端是一直返回信息的,代码里面就得用循环读取,然后在里面吧信息推送至前台页面显示,虽然能正常发送命令接受信息, 1.3,用telnet客户端,一样是因为阻塞到问题2 问题: 由于连接是需要长连接的 1.会偶尔不定时没接受到消息就丢失连接,(这个定时发送心跳包貌似是一种解决办法) 2.我用的是readLine读取数据,这里就会阻塞,页面需要发送命令(同一个流发送)的话后台无法接收到,会一直阻塞到循环读取哪里 希望有想法的各位给点建议或思路或方向。
JsonStore数据请求方式,可以获得Response,却无法读出json格式数据..
我的登录页面,利用extJS的JsonStore组件向Server发送数据,验证用户名密码,然后Server返回将要跳转的页面URL(登录成功或失败页面). 客户端登录表单的【登入】按钮响应以上过程,以下是js代码: [code="js"] buttons : [{ text : '登入', handler : function() { var username = Ext.get('name').getValue(); var pwd = Ext.get('password').getValue(); var store = new Ext.data.JsonStore({ proxy : new Ext.data.HttpProxy({ url : 'logon.do' + '?username=' + username + '&pwd=' + pwd, method : 'GET' }), reader : new Ext.data.JsonReader({ root : 'rows', id : 'id', totalProperty : 'counts', fields : ['topage'] }) }); store.load(); if (store.getAt(0) != null) { Ext.Msg.alert('Info', '共获得'+store.getCount()+'条数据'); window.open(store.getAt(0).get('topage'), '_blank'); } } } [/code] 以下是Server端业务处理代码: [code="java"] public class LogonController extends HttpServlet{ String pageurl=""; String json=""; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException{ response.setContentType("application/x-json;charset=UTF-8"); String username = request.getParameter("username"); String pwd = request.getParameter("pwd"); if(username.equals("jerry") && pwd.equals("1")){ pageurl="http://localhost:8080/hrms/index.html"; }else pageurl="http://localhost:8080/hrms/failure.html"; PrintWriter writer = response.getWriter(); System.out.println(writer.toString()); JSONObject jObj = new JSONObject(); jObj.put("topage",pageurl); json = jObj.toString(); System.out.println(json); writer.write(json); } public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{ doGet(request,response); } } [/code] 通过测试,发现store对象中没有获取到数据(store.getCount()为空),利用FireBug调试,得到以下结果: [img]/upload/attachment/67084/da5a4590-3d40-3015-ba43-93946e6bf5c6.jpg[/img] 说明客户端得到了response,但是json格式的数据没有被解析。 若将store.getAt(0)提出来单独执行,FireBug调试却又得到如下结果: [img]/upload/attachment/67087/d6ead45e-c98e-386e-9b64-7461f271d330.jpg[/img] 请各位给断断,这是怎么回事?谢谢哈。 [b]问题补充:[/b] rain2005: 注释掉也是不行啊,服务器应该是返回一个js页面的吧,这样json才能封装为对象。
httppost = new HttpPost(Uri) 返回值为null! 不知道为什么
RT http.java public class Http { static HttpEntity entity; //HttpEntity是可以同Http消息进行接受或发送的实体,可以是流或者字符串 static HttpResponse response; //HttpResponse是一个Http连接响应,可以通过它来获得一些响应的信息 static HttpPost httppost; static HttpClient httpclient; static Context context; public String strResult; public String Get(String Uri) { return null; } public String Post(final String Uri, final List<NameValuePair> params) { new Thread() { @Override public void run() { // TODO Auto-generated method stub try { //客户端数据打包 httpclient = new DefaultHttpClient();//新建httpclient对象, 默认的Http客户端,可以用它来创建HTTP连接 httppost = new HttpPost(Uri); //新建httppost对象, 连接url httppost.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8)); //客户端发送数据请求,并得到服务器返回数据 response = httpclient.execute(httppost); //获取HttpResponse实例 entity = response.getEntity(); // 得到内容 if (response.getStatusLine().getStatusCode() == 200) { // 取出回应字串 strResult = EntityUtils.toString(response.getEntity()); } } catch (Exception e) { e.printStackTrace();// 报错识别 } super.run(); } }.start(); return strResult; } } NetUtil。java public class NetUitl { public String register(String Username, String Password,String Idcard,String Name,String Sex,int Tel) { String Uri = "http://127.0.0.1:8080/Client/Register"; String tel=String.valueOf(Tel); ArrayList<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("Username", Username)); params.add(new BasicNameValuePair("Password", Password)); params.add(new BasicNameValuePair("Idcard", Idcard)); params.add(new BasicNameValuePair("Sex", Sex)); params.add(new BasicNameValuePair("Realname", Name)); params.add(new BasicNameValuePair("Tel", tel)); return new Http().Post(Uri, params); } register。java public class register extends Activity { EditText username,password,idcard,name,sex,time,tel; Button register,login; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.register); username=(EditText) findViewById(R.id.zhuceusername); password=(EditText) findViewById(R.id.zhucepassword); idcard=(EditText) findViewById(R.id.zhuceidcard); name=(EditText) findViewById(R.id.zhucename); sex=(EditText) findViewById(R.id.zhucesex); tel=(EditText) findViewById(R.id.zhucetel); register=(Button) findViewById(R.id.zhuce); login=(Button) findViewById(R.id.denglu); new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub register.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub try{ if(!username.getText().toString().equals("")&&!password.getText().toString().equals("")&& !idcard.getText().toString().equals("")&&!name.getText().toString().equals("")&& !sex.getText().toString().equals("")&&!tel.getText().toString().equals("")){ String f=new NetUitl().register(username.getText().toString(),password.getText().toString(), idcard.getText().toString(), name.getText().toString(), sex.getText().toString(), Integer.valueOf(tel.getText().toString())); if(f.equals("true")){ Intent intent=new Intent(register.this,zhucesuccess.class); startActivity(intent); finish();} }else{ Toast.makeText(register.this, "内容不能为空!", Toast.LENGTH_SHORT).show();} }catch(Exception e){ Toast.makeText(register.this, "注册失败,服务器连接错误", Toast.LENGTH_SHORT).show(); }}}); }}).start(); login.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub Intent intent=new Intent(register.this,Login.class); startActivity(intent); } }); } } 就是注册不成功,求大神帮帮忙 我补充一下,我执行register.java的register的click事件后,会报String f=new NetUitl().register(...)空指针,我debug后,发现原来是http.java文件中httppost = new HttpPost(Uri);空指针。
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
在中国程序员是青春饭吗?
今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...
《MySQL 性能优化》之理解 MySQL 体系结构
本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。
python自动下载图片
近日闲来无事,总有一种无形的力量萦绕在朕身边,让朕精神涣散,昏昏欲睡。 可是,像朕这么有职业操守的社畜怎么能在上班期间睡瞌睡呢,我不禁陷入了沉思。。。。 突然旁边的IOS同事问:‘嘿,兄弟,我发现一个网站的图片很有意思啊,能不能帮我保存下来提升我的开发灵感?’ 作为一个坚强的社畜怎么能说自己不行呢,当时朕就不假思索的答应:‘oh, It’s simple. Wait for me for a ...
一名大专同学的四个问题
【前言】   收到一封来信,赶上各种事情拖了几日,利用今天要放下工作的时机,做个回复。   2020年到了,就以这一封信,作为开年标志吧。 【正文】   您好,我是一名现在有很多困惑的大二学生。有一些问题想要向您请教。   先说一下我的基本情况,高考失利,不想复读,来到广州一所大专读计算机应用技术专业。学校是偏艺术类的,计算机专业没有实验室更不用说工作室了。而且学校的学风也不好。但我很想在计算机领...
复习一周,京东+百度一面,不小心都拿了Offer
京东和百度一面都问了啥,面试官百般刁难,可惜我全会。
达摩院十大科技趋势发布:2020 非同小可!
【CSDN编者按】1月2日,阿里巴巴发布《达摩院2020十大科技趋势》,十大科技趋势分别是:人工智能从感知智能向认知智能演进;计算存储一体化突破AI算力瓶颈;工业互联网的超融合;机器间大规模协作成为可能;模块化降低芯片设计门槛;规模化生产级区块链应用将走入大众;量子计算进入攻坚期;新材料推动半导体器件革新;保护数据隐私的AI技术将加速落地;云成为IT技术创新的中心 。 新的画卷,正在徐徐展开。...
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
python爬取百部电影数据,我分析出了一个残酷的真相
2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642.66亿元,同比增长5.4%;国产电影总票房411.75亿元,同比增长8.65%,市场占比 64.07%;城市院线观影人次17.27亿,同比增长0.64%。 看上去似乎是一片大好对不对?不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
C++(数据结构与算法):62---搜索树(二叉搜索树、索引二叉搜索树)
一、搜索树的复杂度分析 本文考察二叉搜索树和索引二叉搜索树 二叉搜索树的渐进性能可以和跳表媲美: 查找、插入、删除操作所需的平均时间为Θ(logn) 查找、插入、删除操作的最坏情况的时间为Θ(n) 元素按升序输出时所需时间为Θ(n) 虽然在最坏情况下的查找、插入、删除操作,散列表和二叉搜索树的时间性能相同,但是散列表在最好的情况下具有超级性能Θ(1) 不过,对于一个指定的关键...
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
最全最强!世界大学计算机专业排名总结!
我正在参与CSDN200进20,希望得到您的支持,扫码续投票5次。感谢您! (为表示感谢,您投票后私信我,我把我总结的人工智能手推笔记和思维导图发送给您,感谢!) 目录 泰晤士高等教育世界大学排名 QS 世界大学排名 US News 世界大学排名 世界大学学术排名(Academic Ranking of World Universities) 泰晤士高等教育世界大学排名 中国共...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
一个程序在计算机中是如何运行的?超级干货!!!
强烈声明:本文很干,请自备茶水!???? 开门见山,咱不说废话! 你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } ...
那个在阿里养猪的工程师,5年了……
简介: 在阿里,走过1825天,没有趴下,依旧斗志满满,被称为“五年陈”。他们会被授予一枚戒指,过程就叫做“授戒仪式”。今天,咱们听听阿里的那些“五年陈”们的故事。 下一个五年,猪圈见! 我就是那个在养猪场里敲代码的工程师,一年多前我和20位工程师去了四川的猪场,出发前总架构师慷慨激昂的说:同学们,中国的养猪产业将因为我们而改变。但到了猪场,发现根本不是那么回事:要个WIFI,没有;...
为什么程序猿都不愿意去外包?
分享外包的组织架构,盈利模式,亲身经历,以及根据一些外包朋友的反馈,写了这篇文章 ,希望对正在找工作的老铁有所帮助
leetcode88. 合并两个有序数组
给定两个有序整数数组nums1 和 nums2,将 nums2 合并到nums1中,使得num1 成为一个有序数组。 说明: 初始化nums1 和 nums2 的元素数量分别为m 和 n。 你可以假设nums1有足够的空间(空间大小大于或等于m + n)来保存 nums2 中的元素。 示例: 输入: nums1 = [1,2,3,0,0,0], m = 3 nums2 = ...
立即提问