关于java网络编程中获取输入流中数据的问题?

//服务器端接收消息的类。定制端口号为8888
serviceSocket = new ServerSocket(10000);
//获取socket。这个方法是阻塞式的
socket = serviceSocket.accept();
inputStream = socket.getInputStream();
byte buf[] = new byte[1024];
int len = 0;
len =inputStream.read(buf);
//打印客户端的消息
System.out.println(new String(buf,0,len));
//向客户端生成响应
outputStream = socket.getOutputStream();
outputStream.write("收到".getBytes());

使用如上代码没然后问题。服务端可以获取客户端的数据。客户端也可以获取服务端的响应。但如果把其中inputStream的读取数据方式改为如下:

while((len=inputStream.read(buf))>0){
//此处拼接客户端的消息
}

//在循环外向客户端相应
outputStream = socket.getOutputStream();
outputStream.write("收到".getBytes());

此时就会出错。服务端无法获取客户端的数据。客户端也无法获取服务端的响应。通过一个循环来不断读取流中的数据是io流的通常做法。为什么这儿不行。。。求解。

1个回答

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

各位大神好,我在学习java网络编程时想要建立既可以压缩又可以加密的流,但是在代码 执行过程中在服务器端的输入流建立时被阻塞了,代码无法继续走下去。经过调查我认为 是因为该输入流没有得到从客户端输出流发送过来的数据所以被阻塞了。虽然知道了原因 但是我本人实在是不知道怎么改这段代码,已经被困了一个星期了,这个问题还是没有解 决。如果有知道的大神请您务必帮帮忙,谢谢了。 以下是代码: 服务器端初始化: serverSession(){ initInput(); initOutput(); } 客户端初始化: clientSession(){ initOutput(); initInput(); } initOutput(){ BufferedOutputStream bos = new BufferedOutputStream(soc_.getOutputStream()); String KEY = "abc_1234_ef@1234"; String DEFAULT_CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding"; String KEY_ALGORITHM = "AES"; SecretKeySpec skeySpec = new SecretKeySpec(KEY.getBytes(), KEY_ALGORITHM); Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); CipherOutputStream cos = new CipherOutputStream(bos, cipher); byte[] iv = cipher.getIV(); bos.write(iv); GZIPOutputStream gos = new GZIPOutputStream(cos); ObjectOutputStream oos = new ObjectOutputStream(gos); oos.flush(); gos.flush(); cos.flush(); bos.flush(); } initInput(){ BufferedInputStream is = new BufferedInputStream(soc_.getInputStream()); byte[] iv = new byte[16]; is.read(iv); String KEY = "abc_1234_ef@1234"; String DEFAULT_CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding"; String KEY_ALGORITHM = "AES"; SecretKeySpec skeySpec = new SecretKeySpec(KEY.getBytes(), KEY_ALGORITHM); Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(iv)); CipherInputStream cis = new CipherInputStream(is, cipher); GZIPInputStream gis = new GZIPInputStream(cis); ObjectInputStream ois = new ObjectInputStream(gis); }

Java网络编程对象流对象无法传递

哪位大神路过指点一下,运行后服务器端控制台只能显示已连接就没了,不知道那里出错了,输出不了对象的name和pass,谢谢指点,谢谢![图片说明](https://img-ask.csdn.net/upload/201706/13/1497288855_726606.png)![图片说明](https://img-ask.csdn.net/upload/201706/13/1497289181_207341.png)![图片说明](https://img-ask.csdn.net/upload/201706/13/1497289188_619033.png)

关于Socket中的数据流获取

诚心请教,这段时间在做一个项目,一个GPRS的数据中心。GPRS终端通过Internet将数据传输至数据中心。所以我设想通过Socket去实现通讯。在做model的时候却出现了一个问题。我获取的一段心跳数据出现了错误,做数据比对是用十六进制的形式进行比对的(源数据是十六进制)。代码如下,不知道我错在什么地方请各位指点。[code="java"] private BufferedReader getReader(Socket socket) throws IOException { InputStream socketIn = socket.getInputStream(); return new BufferedReader(new InputStreamReader(socketIn)); }[/code] [code="java"] in= getReader(connection); String str=""; while((str=in.readLine())!=null){ System.out.println("has receive...."); System.out.println("收到原码:"+str); System.out.println("转换为16:"+ String2Hex(str)); if(str.equals("end")) break; } connection.close(); }[/code] 转换成16进制的代码如下: [code="java"] public static String String2Hex(String s){ String str = ""; for(int i=0;i<s.length();i++){ int ch = s.charAt(i); String ss = Integer.toHexString(ch); str = str + ss; } return str.toUpperCase(); } [/code] 我自己分析了一下,但是不知道我的分析是否正确。我分析是在获取Socket的流时候就已经出现了错误,也就是 [code="java"] InputStream socketIn = socket.getInputStream(); return new BufferedReader(new InputStreamReader(socketIn)); [/code] 所以str=in.readLine()就已经是一列错误的字符串了 [code="java"]该心跳包正确的16进制串为:6831003100689B13727077000260000001006A166831003100689B13727077000260000001006A166831003100689B13727077000260000001006A166831003100689B13727077000260000001006A166831003100689B13727077000260000001006A166831003100689B13727077000260000001006A16 我解析的为:68310310689b13727077026000106a1668310310689b13727077026000106a1668310310689b13727077026000106a1668310310689b13727077026000106a1668310310689b13727077026000106a1668310310689b13727077026000106a16 [/code] [b]问题补充:[/b] 感谢megcker 但是问题还是没有解决啊 期待 [b]问题补充:[/b] 6831031068fffd727077026000106a16 这是我使用megcker提供的方法解析出来的前部分 [b]问题补充:[/b] tfqjavaeye 说的这个控制字符没有读取出来的信息是一种思考的方向。但却不是做了((str=in.readLine())!=null)这个判断的原因。当我不用这个判断直接读取以后就转换也还是一样的缺少0 [b]问题补充:[/b] 以上解释出来的用的是[code="java"]DataInputStream dis = new DataInputStream(connection.getInputStream()); //BufferedReader streamReader = getReader(connection); System.out.println("服务器接收到客户端的连接请求:" + String2Hex(dis.readLine())); [/code] 解析出来的为::68310310689b13727077026000106a1668310310689b13727077026000106a1668310310689b13727077026000106a1668310310689b13727077026000106a1668310310689b13727077026000106a1668310310689b13727077026000106a16 我在[url]http://www.leftworld.net/online/j2sedoc/javaref/java.io.datainputstream_dsc.htm#readUTF(java.io.DataInput)[/url]这里发现一段话 数据输入流和数据输出流以稍加修订的 UTF-8 格式表示 Unicode 字符串。 。。。。。。 这种格式与“标准的”UTF-8 格式的区别如下: Null 字符 '\u0000' 用两个字节而不是一个字节格式编码,所以编码后的字符串永不会包含空字符。 不是到是不是因为他编码后的字符串不包含空字符才会导致 我在解析出来的数据中缺少0 也就是tfqjavaeye说的 [b]问题补充:[/b] 问题已经解决了 dwangel 的说法很正确啊 一直都只盯着流 却忽略了这里 多谢各位了

Java Socket 读取TCP服务端数据包不完整

Java Socket 读取TCP服务端数据包不完整:除了利用数据包大小循环读取输入流的得到完整的数据外,还有其他什么方法? 数据包在网络传输的过程中,数据传递到客户端基本处于“无序”态。除了开辟一块内存按数据包的顺序存放外,还有其他更好的方案么?

初学Java网络编程socket,为何我的服务器打不开?

初学Java网络编程socket,写了个服务器,但是打不开,求指导。代码如下 ``` import java.io.*; import java.net.*; import java.util.*; import javafx.application.Application; import javafx.application.Platform; import javafx.scene.Scene; import javafx.scene.control.ScrollPane; import javafx.scene.control.TextArea; import javafx.stage.Stage; public class Test2_2Server extends Application{ //创建显示文本域 private TextArea area = new TextArea(); public void start(Stage primaryStage){ area.setEditable(false); Scene scene = new Scene(new ScrollPane(area), 450,300); primaryStage.setTitle("Test2_2Server"); primaryStage.setScene(scene); primaryStage.show(); try { //创建一个服务器套接字 ServerSocket serverSocket = new ServerSocket(8800); Platform.runLater(() -> area.appendText("Server started at " + new Date() + '\n')); int clientNo = 1; while (true){ //监听 Socket socket = serverSocket.accept(); area.appendText("Starting thread for client " + clientNo + " at " + new Date() + '\n'); //获取客户端地址 InetAddress inetAddress = socket.getInetAddress(); area.appendText("Client " + clientNo + "'s host name is " + inetAddress.getHostName() + '\n'); area.appendText("Client " + clientNo + "'s IP Address is " + inetAddress.getHostAddress() + '\n'); //创建进程 HandleAClient task = new HandleAClient(socket); //开始运行 new Thread(task).start(); //客户端数加一 clientNo++; } } catch(IOException ex) { System.err.println(ex); } } public static void main(String[] args) { launch(args); } //服务器端的任务类 class HandleAClient implements Runnable{ private Socket socket; public HandleAClient(Socket socket1){ this.socket = socket1; } public void run(){ try { //创建输入输出流 DataInputStream inputFromClient = new DataInputStream(socket.getInputStream()); DataOutputStream outputToClient = new DataOutputStream(socket.getOutputStream()); while (true){ //获取客户端数据 double annualInterestRate = inputFromClient.readDouble(); int numberOfYears = inputFromClient.readInt(); double loanAmount = inputFromClient.readDouble(); //计算偿还额 double totalPayment = loanAmount * Math.pow(1 + annualInterestRate * 0.01, numberOfYears); double monthlyPayment = totalPayment / numberOfYears / 12; //将数据传送至客户端 outputToClient.writeDouble(monthlyPayment); outputToClient.writeDouble(totalPayment); //输出 Platform.runLater(() ->{ area.appendText("Annual Interest Rate:" + annualInterestRate + '\n'); area.appendText("Number Of Year:" + numberOfYears + '\n'); area.appendText("Loan Amount:" + loanAmount + '\n'); area.appendText("Monthly Payment:" + monthlyPayment + '\n'); area.appendText("Total Payment:" + totalPayment + '\n'); }); } } catch (IOException ex) { ex.printStackTrace(); } } } } ```

Socket的输入输出问题

MyServer.java ``` import java.util.List; import java.util.Collections; import java.util.ArrayList; import java.net.ServerSocket; import java.net.Socket; import java.io.IOException; public class MyServer{ //定义保存所有Socket的ArrayList,并将其包装为线程安全的 public static List<Socket> socketList = Collections.synchronizedList(new ArrayList<>()); public static void main(String[] args) throws IOException{ ServerSocket ss = new ServerSocket(30000); while(true){ //此行代码会阻塞,将一直等待别人的连接 Socket s = ss.accept(); socketList.add(s); //每当客户端连接后启动一个ServerThread线程为该客户端服务 new Thread(new ServerThread(s)).start(); } } } ``` ServerThread ``` import java.net.Socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; //负责处理每个线程通信的线程类 public class ServerThread implements Runnable{ //定义当前线程所处理的Socket Socket s = null; //该线程所处理的Socket对应的输入流 BufferedReader br = null; public ServerThread(Socket s) throws IOException{ this.s = s; //初始化该Socket对应的输入流 br = new BufferedReader(new InputStreamReader(s.getInputStream())); } public void run(){ try{ String content = null; //采用循环不断地从Socket中读取客户端发过来的数据 while((content = readFromClient()) != null){ //遍历socketList中的每个Socket //将读到的内容向每个Socket发送一次 for(Socket s : MyServer.socketList){ PrintStream ps = new PrintStream(s.getOutputStream()); System.out.println(content); ps.println(content); } } }catch (IOException e){ e.printStackTrace(); } } //定义读取客户端数据的方法 private String readFromClient(){ try{ Thread.sleep(10000); return br.readLine(); } //如果捕获到异常,则表明该Socket对应的客户端已经关闭 catch(Exception e){ //删除该Socket MyServer.socketList.remove(s); } return null; } } ``` MyClient ``` import java.net.Socket; import java.io.PrintStream; import java.io.BufferedReader; import java.io.InputStreamReader; public class MyClient{ public static void main(String[] args) throws Exception{ Socket s = new Socket("127.0.0.1", 30000); //客户端启动ClientThread线程不断地读取来自服务器的数据 new Thread(new ClientThread(s)).start(); //获取该Socket对应的输出流 PrintStream ps = new PrintStream(s.getOutputStream()); String line = null; //不断地读取键盘输入 BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); while((line = br.readLine()) != null){ //将用户的键盘输入内容写入Socket对应的输出流 ps.println(line); } } } ``` ClientThread ``` import java.net.Socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class ClientThread implements Runnable{ //该线程负责处理的Socket private Socket s; //该线程所处理的Socket对应的输入流 BufferedReader br = null; public ClientThread(Socket s) throws IOException{ this.s = s; br = new BufferedReader( new InputStreamReader(s.getInputStream())); } public void run(){ try{ String content = null; //不断地读取Socket输入流中的内容,并将这些内容打印输出 while((content = br.readLine()) != null){ System.out.println(content); } }catch (Exception e){ e.printStackTrace(); } } } ``` 照着书敲得,实现一个命令行聊天。 问题是:MyClient中控制台输入阻塞,当我输入数据时,ServerThread可以通过Socket的输入流获取数据,而ClientThread中的Socket的输入流不能(这里的输入流是为了获取ServerThread中输出数据的时候才用上)。

java socket网络聊天室 客户端接收不到服务端的消息

![图片说明](https://img-ask.csdn.net/upload/202004/17/1587121278_71861.png) 运行之后 服务端给客户端发消息 客户端接收不到服务端的消息 服务端可以接收到客户端的消息 求助!! 服务端代码: ``` package Chat; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; import java.net.ServerSocket; import java.net.Socket; //如果一个类需要有界面的显示,那么该类就需要继承自JFrame,并被称为"窗体类"。 //1.定义JFrame窗体中的组件 //2.在构造方法中初始化窗体的组件 //3.使用网络编程完成数据的传输(TCP,UDP 协议) //4.实现发送按钮的监听点击事件 public class ServerChatMain extends JFrame implements ActionListener{ public static void main(String[] args) { //调用构造方法 new ServerChatMain(); } //属性 //文本域 private JTextArea jta; //滚动条 private JScrollPane jsp; //面板 private JPanel jp; //文本框 private JTextField jtf; //按钮 private JButton jb; //输出流 private BufferedWriter bw = null; //构造方法 public ServerChatMain(){ //初始化组件 jta = new JTextArea(); //注意:需要设置文本域默认不可编辑 jta.setEditable(false); //注意:需要将文本域添加到滚动条中,实现滚动效果。 jsp = new JScrollPane(jta); //面板 jp = new JPanel(); jtf = new JTextField(10); jb = new JButton("发送"); //注意:需要将文本框与按钮添加到面板中 jp.add(jtf); jp.add(jb); //注意:需要将文本框与面板全部添加到窗体中 this.add(jsp, BorderLayout.CENTER); this.add(jp,BorderLayout.SOUTH); //注意:需要设置标题,大小,位置,关闭,是否可见 this.setTitle("聊天室服务端"); this.setSize(300,300); this.setLocation(300,300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); //TCP服务端开始 //给发送按钮绑定一个监听点击事件 jb.addActionListener(this); try{ //1.创建服务端套接字 ServerSocket serverSocket= new ServerSocket(8888); //2.等待服务端的连接 Socket socket = serverSocket.accept(); //3.获取Socket通道输入流(使用BufferedReader实现每行读取) //InputStream in= socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); //4. 获取Socket通道输出流(使用BufferedWriter实现刷新和换行) //当用户需要点击发送按钮的时候需要写出数据 bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //循环读取数据,并拼接到文本域中 String line = null; while((line=br.readLine())!=null){ //将读取的数据拼接到文本域中显示 jta.append(line+System.lineSeparator()); } //5.关闭ServerSocket通道 serverSocket.close(); }catch (IOException e){ e.printStackTrace(); } //TCP服务端结束 } @Override public void actionPerformed(ActionEvent e){ //System.out.println("发送按钮被点击了"); //1.获取文本框中发送的内容 String text =jtf.getText(); //2.拼接需要发送的内容 text ="服务端对客户端说:"+text; jta.append(text+System.lineSeparator() ); //3.发送 try { bw.write(text); bw.newLine(); bw.flush(); //4.清空文本框内容 jtf.setText(""); } catch (IOException e1) { e1.printStackTrace(); } } } ``` 客户端代码: ``` package Chat; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; import java.net.Socket; //如果一个类需要有界面的显示,那么该类就需要继承自JFrame,并被称为"窗体类"。 //1.定义JFrame窗体中的组件 //2.在构造方法中初始化窗体的组件 public class ClientChatMain extends JFrame implements ActionListener { public static void main(String[] args) { //调用构造方法 new ClientChatMain(); } //属性 //文本域 private JTextArea jta; //滚动条 private JScrollPane jsp; //面板 private JPanel jp; //文本框 private JTextField jtf; //按钮 private JButton jb; //输出流 private BufferedWriter bw = null; //构造方法 public ClientChatMain() { //初始化组件 jta = new JTextArea(); //注意:需要设置文本域默认不可编辑 jta.setEditable(false); //注意:需要将文本域添加到滚动条中,实现滚动效果。 jsp = new JScrollPane(jta); //面板 jp = new JPanel(); jtf = new JTextField(10); jb = new JButton("发送"); //注意:需要将文本框与按钮添加到面板中 jp.add(jtf); jp.add(jb); //注意:需要将文本框与面板全部添加到窗体中 this.add(jsp, BorderLayout.CENTER); this.add(jp, BorderLayout.SOUTH); //注意:需要设置标题,大小,位置,关闭,是否可见 this.setTitle("聊天室客户端"); this.setSize(300, 300); this.setLocation(300, 300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); //TCP客户端开始 //给发送按钮绑定一个监听点击事件 jb.addActionListener(this); try { //1.创建客户端套接字(尝试连接) Socket socket = new Socket( "192.168.1.106",8888); //2.获取socket通道输入流 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); //3.获取socket通道输出流 bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //循环读取数据,并拼接到文本域中 String line = null; while ((line = br.readLine()) != null) ; jta.append(line + System.lineSeparator()); //4.关闭socket通道 socket.close(); } catch (Exception e) { e.printStackTrace(); } //TCP客户端结束 } @Override public void actionPerformed(ActionEvent e){ //1.需要获取文本框中需要发送的数据内容 String text =jtf.getText(); //2.拼接内容 text = "客户端对服务端说:"+text; //3.自己显示 jta.append(text+System.lineSeparator()); try { //4.发送 bw.write(text); bw.newLine(); bw.flush(); //5.清空 jtf.setText(""); } catch (IOException ex) { ex.printStackTrace(); } } } ```

用java从文件中读取utf-8编码,并将其编码后输出对应的字符

文本文件(.txt)中有一行utf-8编码,例如:\u4E2D\u534E\u4EBA\u6C11\u5171\u548C\u56FD,怎么样才能利用java将其从文件中读取出来以后进行编码,并将其对应的字符输出来?

java 访问ftp读文件

项目中有一些数据信息必须存放在文件中,不存数据库,而且文件放在ftp服务器上,所以需要用到FtpClient读文件。 碰到问题如下: InputStream in = XXXXXX(通过ftpClient对象获取到输入流); byte[] buff = new byte[512]; int len = 0; while((len = in.read(buff)) != -1) { system.out.println("读取的长度: "+ len); } 假如文件流中一共有2036个字节,多次执行以上代码打印出来的结果会有两种 一: 512 512 512 500 二: 512 300 512 512 200 问题的意思就是情况2其中有一次读取会少于512个字节,是什么原因呢?情况一是想要的结果、但是多次运行以上代码,偶尔会出现情况二(比如执行10次出现2次) 急求解!!求帮忙

jdk1.6 httpserver如何获取表单post过来的表单元素值呢?

package com.tdt.server.httpserver; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.InetSocketAddress; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; import com.sun.net.httpserver.spi.HttpServerProvider; /** * @project SimpleHttpServer * @author sunnylocus * @vresion 1.0 2009-9-2 * @description 自定义的http服务器 */ public class MyHttpServer { //启动服务,监听来自客户端的请求 public static void httpserverService() throws IOException { HttpServerProvider provider = HttpServerProvider.provider(); HttpServer httpserver =provider.createHttpServer(new InetSocketAddress(6666), 100);//监听端口6666,能同时接 受100个请求 httpserver.createContext("/myApp", new MyHttpHandler()); httpserver.setExecutor(null); httpserver.start(); System.out.println("server started"); } //Http请求处理类 static class MyHttpHandler implements HttpHandler { public void handle(HttpExchange httpExchange) throws IOException { String responseMsg = "ok"; //响应信息 InputStream in = httpExchange.getRequestBody(); //获得输入流 BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String temp = null; while((temp = reader.readLine()) != null) { System.out.println("client request:"+temp); } httpExchange.sendResponseHeaders(200, responseMsg.length()); //设置响应头属性及响应信息的长度 OutputStream out = httpExchange.getResponseBody(); //获得输出流 out.write(responseMsg.getBytes()); out.flush(); httpExchange.close(); } } public static void main(String[] args) throws IOException { httpserverService(); } } MyHttpHandler 中如何去获取request中的各个表单元素的值?

socket 客户端读取服务端发送的 序列化流 报错

![图片说明](https://img-ask.csdn.net/upload/201509/12/1442045768_819792.png) 客户端 ![图片说明](https://img-ask.csdn.net/upload/201509/12/1442045818_160818.png) 服务端 ![图片说明](https://img-ask.csdn.net/upload/201509/12/1442046006_547771.png) ![图片说明](https://img-ask.csdn.net/upload/201509/12/1442046074_422756.png) 请大神指教,实在找不到原因了,对这块儿也不是很熟

使用TCP编程客户端代码运行起来报错

本人是新手开始学习TCP编程: 如下是客户端的代码 ```package Day23.Internet.TCP; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; //TCP的客户端 public class Demo1Client { //TCP的客户端使用步骤 public static void main(String[] args) throws IOException { //1.建立TCP的服务 Socket socket = new Socket(InetAddress.getLocalHost(), 60000); //2.获取到对应的流对象(获取到Socket 的输出流对象) OutputStream outputStream = socket.getOutputStream(); //3.利用输出流对案发把数据写出即可 outputStream.write("服务器你好".getBytes()); System.out.println("发送了!!"); outputStream.flush(); //4.关闭TCP服务 socket.close(); System.out.println("关闭了客户端!!"); } } ``` 以下是服务器的代码 ```package Day23.Internet.TCP; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; //TCP的服务端 //使用ServerSocket public class Demo1Server { public static void main(String[] args) { try { // 1.建立TCP的服务端,并监听一个端口 ServerSocket serverSocket = new ServerSocket(60000); // 2.获取输入溜对象,读取客户端发送的信息 //ServerSocket并没有下面的方法 但是Socket有呀 // serverSocket. getInputStream() //可以先利用ServerSocet的accept方法获取连接到的Socket对象 Socket socket = serverSocket.accept(); System.out.println("hehe"); InputStream inputStream = socket.getInputStream(); byte[] buf = new byte[1024]; int length = inputStream.read(buf); System.out.println(new String()); serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 运行起来后 报错如下(是客户端的问题) ``` Exception in thread "main" java.net.ConnectException: Connection timed out: connect at java.net.DualStackPlainSocketImpl.connect0(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) at java.net.AbstractPlainSocketImpl.connect(Unknown Source) at java.net.PlainSocketImpl.connect(Unknown Source) at java.net.SocksSocketImpl.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.<init>(Unknown Source) at java.net.Socket.<init>(Unknown Source) ```

使用eclipse用TCP协议创建服务器和客户端,从客户端向服务器传文件

服务器代码: package com.xfr.test; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; public class Test2_UpLoadServer { /**  * @param args  * @throws IOException   */ public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(6666); //创建服务器,绑定端口号777 System.out.println("启动服务器,端口号为6666!!!"); while(true){ final Socket socket = server.accept();  //接收客户端的请求,有可能接收多个客户端的请求,所以用多线程 new Thread(){ public void run(){ try { InputStream  is = socket.getInputStream(); //拿到客户端的流 BufferedReader br = new BufferedReader(new InputStreamReader(is)); //用Buffer缓冲区更好读取 PrintStream ps = new PrintStream(socket.getOutputStream()); //用PrintStream的好处是可以写字符也可以写字节 String fileName = br.readLine();//接收到要上传的文件的名字 File dir = new File("upload"); //创建一个文件夹来存放文件 dir.mkdir(); File file = new File(dir,fileName); //对文件名字进行封装来进行判断操作 if(file.exists()){ ps.println("存在"); //若文件在服务器中存在,给与客户端提示 socket.close(); }else{ //文件在服务器中没有,则开始接收 FileOutputStream fos = new FileOutputStream(file); byte[] arr = new byte[8192]; int len; while(( len = is.read(arr)) != -1){ fos.write(arr, 0, len); } fos.close(); //记得关流和关端口 socket.close(); } } catch (IOException e) { e.printStackTrace(); } } }.start(); } } } 客户端代码: package com.xfr.test; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; public class Test2_UploadClient { /**  * 向服务器上传文件,文件路径从键盘获取  * @param args  * @throws IOException   * @throws UnknownHostException   */ public static void main(String[] args) throws UnknownHostException, IOException { Socket socket = new Socket("169.254.33.252",6666);//创建客户端 File file = getFile();//获取文件 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintStream ps = new PrintStream(socket.getOutputStream()); ps.println(file.getName()); //将文件名字传给服务器,服务器再对其进行判断 String result = br.readLine(); if("存在".equals(result)){ System.out.println("该文件在服务器中已经存在,请不要重复上传!"); socket.close(); return; } else { //文件不存在的话,开始读取该文件 FileInputStream fis = new FileInputStream(file); byte[] arr = new byte[8192];  int len; while((len = fis.read(arr)) != -1){ ps.write(arr, 0, len);//向服务器传 } fis.close(); socket.close();//F:\Test\aaa.txt } } public static File getFile() { Scanner sc = new Scanner(System.in); while(true){ String s = sc.nextLine(); File file = new File(s); if(!file.exists()){ System.out.println("您要上传的文件不存在!重新输入文件路径:"); } else if(file.isDirectory()){ System.out.println("您输入的是文件夹路径!重新输入文件路径:"); } else{ return file; } } } } ###执行后输入路径,路径正确的话程序不会停下来,红方块一直在 ![图片说明](https://img-ask.csdn.net/upload/201710/25/1508926710_596979.png) 手动点掉红方块后刷新项目 ![图片说明](https://img-ask.csdn.net/upload/201710/25/1508926743_190021.png) 可以看到eclipse当前路径多了要拷贝的文件,可是文件字节大小为0 ![图片说明](https://img-ask.csdn.net/upload/201710/25/1508926754_412742.png) 更多

URLConnection无法获得InputStream的问题

我在使用URLConnection的时候遇到以下问题: 1:程序运行到以下代码处停止运行(可能是阻塞): InputStream in = connection.getInputStream(); 2:无法捕获到任何异常 3:URLConnection一直处于正常状态 4:如果通过IE直接访问URL一次, 程序就会顺利执行下去(就像程序中设置了断点,我通过IE访问URL时continue了) 请问各位朋友有没有遇到类似的问题,有没有什么思路和建议? 以下是我的代码: [code="java"]private String readResponse(URLConnection connection, String encoding) { StringBuffer sb = new StringBuffer(); BufferedReader br = null; try { InputStream in = connection.getInputStream(); br = new BufferedReader(new InputStreamReader(in)); String line = br.readLine(); while (line != null) { ..... } } catch (Throwable e) { logger.info("readResponse().catch...",e); e.printStackTrace(); } finally { logger.info("readResponse().finally..."); closeStream(br); } String result = sb.toString(); logger.info("Response is :"); logger.info(result); return result; }[/code]

ContentType 为application/x-www-form-urlencoded,post请求,如何获得请求的内容

项目为SSH,我直接读取request的输入流里面获取不到请求内容,不知道怎么获取

js jsp 向servlet跳转过程中的request问题

当在html中使用<form enctype="multipart/form-data">时(使用fileupload上传文件),request.getParameter("name")得到的是null,为了避免这一问题,并且为了检验输入框是否为空,通过js向servlet提交。这样值可以传过去了,但是上传图片中解析request的值却为null 现在想要得到即可以检验输入是否为空,又可以得到传值并将图片保存起来的效果。顺便想请教一下 js跳转的servlet的request和action跳转到servlet的request有什么不同。 P.S:请您不要怀疑什么没有进到servlet等类似问题。如果您有更好的解决方案,非常感谢您的告知,我会在一段日子后研究,但现在我的主要问题是使用html、js、servlet这三种技术解决问题。 非常感谢! 代码如下 html: <%@ page contentType="text/html;charset=GBK" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html lang="en"> <head> <title>新增商家</title> </head> <body> <style> body,td{font-size:12px;} </style> <script language=javascript> //验证填入值不为空 function checkEmpty(){ var name = document.getElementById("merchantName").value; var call = document.getElementById("merchantCall").value; var picture = document.getElementById("picture").value; var address = document.getElementById("merchantAdd").value; var validate = document.getElementById("validatetCall").value; if(name==""||call==""||picture==""||address==""||validate==""){ alert("请您填写所需要的信息"); } else{ // 跳转到AddMerchantServlet中 document.merchantForm.action = "/discountCoupon/AddMerchant?name="+name+"&call="+call+"&picture="+picture+"&address="+address+"&verifyCall="+validate ; document.merchantForm.submit(); } } </script> <form name="merchantForm" enctype="multipart/form-data" method="post" > <fieldset style="width: 600; height: 60;padding:2px;" > <table> <tr> <td> <font color="red">*</font> 商家名称: <input type="text" id="merchantName" width="280px" style="height:18px;width:300px" value="请您限制在10个字以内" /> </td> </tr> <tr> <td> <font color="red">*</font> 商家电话: <input type="text" id="merchantCall" maxlength="11" /> </td> </tr> <tr> <td> <font color="red">*</font> 商家海报: <input type="file" id="picture" /> <input type="reset" /> </td></tr> <tr> <td> <font color="red">*</font> 商家地址: <input type="text" id="merchantAdd" style="height:18px;width:300px" /> </td> </tr> <tr> <td> <font color="red">*</font> 验证手机: <input type="text" id="validatetCall" maxlength="11" />&nbsp &nbsp添加 </td> </tr> <tr> <td> <input type="submit" value="保存" name="save" onclick="checkEmpty();" /> </td> <td>&nbsp &nbsp </td> <td> <input type="button" value="取消" name="cancel" onclick="window.close();" /> </td> </tr> </table> </fieldset> </form> </body> </html> servlet package com.ygsoft.servlet; import java.io.BufferedInputStream; public class AddMerchant extends HttpServlet { private static final long serialVersionUID = 1L; File tmpDir = null; File saveDir = null; @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); //从addMerchant.jsp中取得数据 String name = request.getParameter("name"); //对得到的数据进行转码 byte [] bytes1 = name.getBytes("iso-8859-1"); String merchantName = new String(bytes1,"GBK"); String merchantCall = request.getParameter("call"); String merchantPicture = request.getParameter("picture"); //对得到的数据进行转码 byte [] bytes2 = merchantPicture.getBytes("iso-8859-1"); String picture = new String(bytes2,"GBK"); String address = request.getParameter("address"); //对得到的数据进行转码 byte [] bytes3 = address.getBytes("iso-8859-1"); String merchantAdd = new String(bytes3,"GBK"); String validateCall = request.getParameter("verifyCall"); //向数据库中存储数据 BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml"); MerchantDao dao = (MerchantDao) factory.getBean("merchantDao"); Merchant merchant = new Merchant(); MerchantAssistant merchantAssistant = new MerchantAssistant(); HashSet<MerchantAssistant> set = new HashSet<MerchantAssistant>(); merchantAssistant.setVerifyUserPhoneNum(validateCall); merchantAssistant.setActive(1); set.add(merchantAssistant); merchant.setMerchantName(merchantName); merchant.setMerchantAdd(merchantAdd); merchant.setMerchantPhoneNum(merchantCall); merchant.setMerchantPic(picture); merchantAssistant.setMerchant(merchant); merchant.setMerchantAssistantSet(set); dao.addMerchant(merchant); //跳转到商家管理页面 RequestDispatcher rd = request.getRequestDispatcher("/merchantManage"); rd.forward(request, response); } public AddMerchant() { super(); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //对图片进行存储 try { if (ServletFileUpload.isMultipartContent(request)) { // 创建该对象 DiskFileItemFactory dff = new DiskFileItemFactory(); // 指定上传文件的临时目录 dff.setRepository(tmpDir); // 指定在内存中缓存数据大小,单位为byte dff.setSizeThreshold(1024000); // 创建该对象 ServletFileUpload sfu = new ServletFileUpload(dff); // 指定上传文件的最大尺寸 sfu.setFileSizeMax(5000000); // 指定依次上传多个文件的总尺寸 sfu.setSizeMax(10000000); // 解析request请求,并返回FileItemIterator集合 FileItemIterator fii = sfu.getItemIterator(request); // 解析request请求,并返回FileItemIterator while (fii.hasNext()) { // 从集合中获得一个文件流 FileItemStream fis = fii.next(); // 过滤表单中空文件域 if ((!fis.isFormField()) && fis.getName().length() > 0) { // 获得的上传文件的文件名 String fileName = fis.getName().substring( fis.getName().lastIndexOf("//") + 1); if (fis.getName().lastIndexOf("//") == -1) { fileName = fis.getName().substring( fis.getName().lastIndexOf("/") + 1); // 获得文件输入流 BufferedInputStream in = new BufferedInputStream( fis.openStream()); // 获得文件输出流 BufferedOutputStream out = new BufferedOutputStream( new FileOutputStream(new File(saveDir, fileName))); // 开始把文件写到你指定的上传文件夹 Streams.copy(in, out, true); } } } } } catch (Exception e) { e.printStackTrace(); } } public void init() throws ServletException { super.init(); String tmpPath = "d://tempdir"; String savePath = "d://savedir"; tmpDir = new File(tmpPath); saveDir = new File(savePath); if (!tmpDir.isDirectory()) tmpDir.mkdir(); if (!saveDir.isDirectory()) saveDir.mkdir(); } }

程序员的兼职技能课

程序员的兼职技能课

为linux系统设计一个简单的二级文件系统

实验目的: 通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。 实验要求: 为linux系统设计一个简单的二级文件系统。要求做到以下几点: (1)可以实现下列几条命令(至少4条)

CCNA+HCNA+wireshark抓包综合网工技能提升套餐

本套餐包含思科路由交换CCNA,部分CCNP核心,华为HCNA以及wireshark抓包等类容,旨在培养具有综合能力的网络工程师。

董付国老师Python全栈学习优惠套餐

购买套餐的朋友可以关注微信公众号“Python小屋”,上传付款截图,然后领取董老师任意图书1本。

成年人用得到的6款资源网站!各个都是宝藏,绝对让你大饱眼福!

不管是学习还是工作,我们都需要一些资源帮助我们有效地解决实际问题。 很多人找资源只知道上百度,但是你们知道吗,有的资源是百度也搜索不出来的,那么今天小编就给大家介绍几款好用的资源网站,大家赶紧收入囊中吧! 1.网盘007 https://wangpan007.com/ 一款全能的资源搜索网站!只需要输入关键字,就能获得你想要的视频、音乐、压缩包等各种资源,网上...

矿车轴载荷计算方法的比较及选用

针对矿车轴的弯曲损坏,分析了固定式矿车车轴的受力,并对力叠加法以及当量负荷法2种计算方法进行了分析和比较,认为应采用当量负荷法进行车轴的设计计算。

Python数据清洗实战入门

Python数据清洗实战入门

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

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

Polar编码matlab程序

matlab实现的Polar codes源程序

2019全国大学生数学建模竞赛C题原版优秀论文

2019全国大学生数学建模竞赛C题原版优秀论文,PDF原版论文,不是图片合成的,是可编辑的文字版。共三篇。 C044.pdf C137.pdf C308.pdf

Linux常用命令大全(非常全!!!)

Linux常用命令大全(非常全!!!) 最近都在和Linux打交道,感觉还不错。我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因,比较短小但却功能强大。我将我了解到的命令列举一下,仅供大家参考: 系统信息 arch 显示机器的处理器架构 uname -m 显示机器的处理器架构 uname -r 显示正在使用的内核版本 d...

Linux下聊天室实现(基于C)

在linux下的基于TCP/IP,采用socket通信的聊天室,实现进入聊天室,进行多人群聊,指定人进行私聊,群主管理员功能,颗进行禁言,提出群聊等操作。个人账号可修改昵称或者修改密码,还可进行找回密

一个较完整的Qt用户登录界面设计

一个较完整的Qt用户登录界面,稍微移植可用,用sqlite数据库存储用户名和密码,具有增加和删除用户的功能,开发环境为ubuntu16.04+Qt5.6.1,win7下程序也编译可用。贡献出来,共同学

机器学习初学者必会的案例精讲

机器学习初学者必会的案例精讲

【C语言】贪吃蛇游戏代码(Visual C++6.0实现)

本游戏代码参考《C语言项目开发全程实录(第二版)》第六章。代码已在Visual C++6.0环境下编译测试通过,可在VC++6.0编译器中导入工程编译运行查看效果,或者也可以直接运行Release或D

Android小项目——新闻APP(源码)

Android小项目——新闻APP(源码),一个很简单的可以练手的Android Demo Ps:下载之前可以先看一下这篇文章——https://blog.csdn.net/qq_34149526/a

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

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

Android音视频开发全套

Android平台音视频开发全套,涉及:FFmpeg软解码解码、Mediacodec硬解码编码、Openssl音频播放、OpenGL ES视频渲染、RTMP推流等核心重要知识点。

YOLOv3目标检测实战:训练自己的数据集

YOLOv3目标检测实战:训练自己的数据集

2019 Python开发者日-培训

2019 Python开发者日-培训

2019 AI开发者大会

2019 AI开发者大会

Windows版YOLOv4目标检测实战:训练自己的数据集

Windows版YOLOv4目标检测实战:训练自己的数据集

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

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

因为看了这些书,我大二就拿了华为Offer

四年了,四年,你知道大学这四年我怎么过的么?

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

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

我说我不会算法,阿里把我挂了。

不说了,字节跳动也反手把我挂了。

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

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

YOLOv3目标检测实战系列课程

《YOLOv3目标检测实战系列课程》旨在帮助大家掌握YOLOv3目标检测的训练、原理、源码与网络模型改进方法。 本课程的YOLOv3使用原作darknet(c语言编写),在Ubuntu系统上做项目演示。 本系列课程包括三门课: (1)《YOLOv3目标检测实战:训练自己的数据集》 包括:安装darknet、给自己的数据集打标签、整理自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计(mAP计算和画出PR曲线)和先验框聚类。 (2)《YOLOv3目标检测:原理与源码解析》讲解YOLOv1、YOLOv2、YOLOv3的原理、程序流程并解析各层的源码。 (3)《YOLOv3目标检测:网络模型改进方法》讲解YOLOv3的改进方法,包括改进1:不显示指定类别目标的方法 (增加功能) ;改进2:合并BN层到卷积层 (加快推理速度) ; 改进3:使用GIoU指标和损失函数 (提高检测精度) ;改进4:tiny YOLOv3 (简化网络模型)并介绍 AlexeyAB/darknet项目。

DirectX修复工具V4.0增强版

DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复

C++语言基础视频教程

C++语言基础视频教程

形考任务一答案.zip

国开电大VisualBasic程序设计形考任务答案 请同学选择课程实验栏目“实验1 欢迎程序”或“实验2 计时秒表程序”的其中之一,在VB集成开发环境中认真完成实验。

在线考试系统导出试题代码

在线考试系统导出试题代码,将试题以word形式导出

软件测试入门、SQL、性能测试、测试管理工具

软件测试2小时入门,让您快速了解软件测试基本知识,有系统的了解; SQL一小时,让您快速理解和掌握SQL基本语法 jmeter性能测试 ,让您快速了解主流来源性能测试工具jmeter 测试管理工具-禅道,让您快速学会禅道的使用,学会测试项目、用例、缺陷的管理、

相关热词 c#跨线程停止timer c#批量写入sql数据库 c# 自动安装浏览器 c#语言基础考试题 c# 偏移量打印是什么 c# 绘制曲线图 c#框体中的退出函数 c# 按钮透明背景 c# idl 混编出错 c#在位置0处没有任何行
立即提问