老师,请问这里的唤醒线程的"abc"是必须与上面synchronized("abc")一样吗
老师,我这里能用geiNode方法获取前一个节点吗?
public class Test01 { public static void main(String[] args) { System.out.println("step1"); try { int j=2/0; } catch (Exception e) { e.printStackTrace(); } System.out.println("step2"); } }
老师我这个代码怎么跑出来顺序有点不对啊
按道理说异常应该出现在中间的吧。
我用debug又正常了
求解答,这个异常报错的位置是随机的吗,还是这个是idea的问题。
老师好像是我唤醒线程这一块出了问题运行连接都成功了就是聊天系统这一块似乎消息都在缓冲区我唤醒线程那一块出了问题 但是我校对了几遍也没发现那里出错了
package com.bzsxt; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; /** * 接收客户端的线程类 */ class ChatReceive extends Thread{ private Socket socket; public ChatReceive(Socket socket) { this.socket = socket; } @Override public void run() { this.receiveMsg(); } /** * 实现接收客户端发送的消息 */ private void receiveMsg(){ BufferedReader br = null; try{ br = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); while(true){ String msg = br.readLine(); synchronized ("砸瓦鲁多"){ //把读取到的数据写入公共数据区 ChatRoomServer.buf="["+this.socket.getInetAddress()+"] "+msg; //唤醒发送消息的线程对象 "砸瓦鲁多".notifyAll(); } } }catch (Exception e){ e.printStackTrace(); }finally{ if (br != null){ try { br.close(); } catch (IOException e) { e.printStackTrace(); } } if (this.socket != null){ try { this.socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } } /** * 向客户端发送消息的线程类 */ class ChatSend extends Thread{ private Socket socket; public ChatSend(Socket socket) { this.socket = socket; } @Override public void run() { this.sendMsg(); } /** * 将公共数据区的消息发送给客户端 */ private void sendMsg(){ PrintWriter pw = null; try{ pw = new PrintWriter(this.socket.getOutputStream()); while(true){ synchronized ("砸瓦鲁多"){ //让发送消息的线程处于等待状态 "砸瓦鲁多".wait(); //将公共数据区中的消息发送给客户端 pw.print(ChatRoomServer.buf); pw.flush(); } } }catch (Exception e){ e.printStackTrace(); }finally { if (pw != null){ pw.close(); } if (this.socket != null){ try { this.socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } } public class ChatRoomServer { //定义公共数据区 public static String buf; public static void main(String[] args) { System.out.println("Chat Server Version 1.0"); System.out.println("Listen at 8888......"); ServerSocket serverSocket = null; try{ serverSocket = new ServerSocket(8888); while(true){ Socket socket = serverSocket.accept(); System.out.println("连接到:"+socket.getInetAddress()); new ChatReceive(socket).start(); new ChatSend(socket).start(); } }catch (Exception e){ e.printStackTrace(); }finally { if (serverSocket != null){ try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
老师,我想请问我对String和StringBuilder的理解是否正确:
String 对象每次使用方法(比如str.concat())都会在内存里创建一个新的对象。
StringBuilder 对象每次使用方法,只会对自己起作用,不会创建新的对象。
以上理解是否正确呢?
老师明明显示连接成功了怎么还会报错呀这是代码
package com.bzsxt; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; class Send1 extends Thread{ private Socket socket; private Scanner scanner; public Send1(Socket socket,Scanner scanner) { this.socket = socket; this.scanner = scanner; } @Override public void run() { this.sendMsg(); } /** * 发送消息 */ private void sendMsg(){ PrintWriter pw = null; try{ //创建向对方输出消息的对象流 pw = new PrintWriter(this.socket.getOutputStream()); while(true){ String msg = scanner.nextLine(); pw.println(msg); pw.flush(); } }catch (Exception e){ e.printStackTrace(); }finally{ if (scanner != null){ scanner.close(); } if (pw != null){ pw.close(); } if (this.socket != null){ try { this.socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } } /** * 接收消息的线程 */ class Receive1 extends Thread{ private Socket socket; public Receive1(Socket socket) { this.socket = socket; } @Override public void run() { this.receiveMsg(); } /** * 用于接收对方消息的方法 */ private void receiveMsg(){ BufferedReader br = null; try{ //创建用于接收对方消息的流对象 br = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); while(true){ String msg = br.readLine(); System.out.println("他说:"+msg); } }catch(Exception e){ e.printStackTrace(); }finally{ if (br != null){ try { br.close(); } catch (IOException e) { e.printStackTrace(); } } if (this.socket != null){ try { this.socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } } public class GoodTCP { public static void main(String[] args) { Scanner scanner = null; ServerSocket serverSocket = null; Socket socket = null; try{ scanner = new Scanner(System.in); System.out.println("请输入:server,<port>或:<ip>,<port>"); String str = scanner.nextLine(); String[]arr = str.split(","); if ("server".equals(arr[0])){ //启动服务端 System.out.println("TCP Server Listen at"+arr[1]+" ....."); serverSocket = new ServerSocket(Integer.parseInt(arr[1])); System.out.println("连接成功!"); }else{ //启动客户端 socket = new Socket(arr[0],Integer.parseInt(arr[1])); System.out.println("连接成功!"); } //启动发送消息的线程 new Send1(socket,scanner).start(); //启动接收消息的线程 new Receive1(socket).start(); }catch(Exception e){ e.printStackTrace(); }finally{ if (serverSocket != null){ try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
老师,还是不太明白,这里的字符串锁到底锁了什么东西啊
老师,请帮忙看看哪里错了
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; /** * 创建发送消息线程 */ class send1 extends Thread{ private Socket socket; private Scanner scanner; public send1(Socket socket,Scanner scanner){ this.socket=socket; this.scanner=scanner; } @Override public void run() { this.sendMsg(); } /** * 创建发现消息方法 */ public void sendMsg(){ PrintWriter pw=null; try{ //创建发送信息流对象 pw=new PrintWriter(this.socket.getOutputStream()); while (true){ String str=scanner.nextLine(); pw.println(str); pw.flush(); } }catch (Exception e){ e.printStackTrace(); }finally { if(scanner!=null){ scanner.close(); } if(pw!=null){ pw.close(); } if(this.socket!=null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } } /** * 创建接受消息线程 */ class receive1 extends Thread{ private Socket socket; public receive1 (Socket socket){ this.socket=socket; } @Override public void run() { this.receiveMeg(); } /** * 用于接受对方消息的方法 */ public void receiveMeg(){ BufferedReader br=null; try{ br=new BufferedReader(new InputStreamReader(socket.getInputStream())); while (true){ String str= br.readLine(); System.out.println("对方说:"+str); } }catch (Exception e){ e.printStackTrace(); }finally { if(br!=null){ try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } } } public class GoodTCP { public static void main(String[] args) { Scanner scanner=null; ServerSocket serverSocket=null; Socket socket=null; try{ scanner=new Scanner(System.in); System.out.println("请输入:server,<port>或者<ip>,<port>"); String str=scanner.nextLine(); String[] arr=str.split(",");//用逗号分割内容 if("server".equals(arr[0])){ //启动服务器 System.out.println("TCP Server Listen at"+arr[1]+"...."); serverSocket=new ServerSocket(Integer.parseInt(arr[1])); socket=serverSocket.accept(); System.out.println("链接成功"); }else{ //启动客户端 socket=new Socket(arr[0],Integer.parseInt(arr[1])); System.out.println("链接成功"); } //启动发送消息线程 new send1(socket,scanner).start(); new receive1(socket).start(); }catch (Exception e){ e.printStackTrace(); }finally { if(serverSocket!=null){ try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
老师我不调用fos.flush方法也可以把图片写入到d盘当中啊
输出结果截图:
问题一:我最后是打印了两个时间,为什么只输出一个?
问题二:好像加不加.toString()打印结果都一样,那为什么还要用.toString
老师,为什么这里就不把Socket创建在Try外面了呢
老师,为什么这里不直接将内容写在run方法里呢
老师隐藏的文件怎么还原啊我隐藏了不知道到哪儿了
老师什么我最后那个s4输出的是13
package com.bjsxt; import java.io.FileInputStream; public class FirstDemo { public static void main(String[] args) { //创建字节输入流对象 FileInputStream fis=null; try{ fis=new FileInputStream("d:/a.txt"); int s1=fis.read();//打印输入字符a对应的ascii码值97 int s2=fis.read();//打印输入字符b对应的ascii码值98 int s3=fis.read();//打印输入字符c对应的ascii码值99 int s4=fis.read(); System.out.println(s1); System.out.println(s2); System.out.println(s3); System.out.println(s4); }catch (Exception e){ e.printStackTrace(); }finally { if(fis!=null) { try{ fis.close(); }catch (Exception e){ e.printStackTrace(); } } } } }
老师,请问为什么PrintWriter不需要转字符串啊,还有pw为什么不会抛出异常呢
非常抱歉给您带来不好的体验!为了更深入的了解您的学习情况以及遇到的问题,您可以直接拨打投诉热线:
我们将在第一时间处理好您的问题!
关于
课程分类
百战程序员微信公众号
百战程序员微信小程序
©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园网站维护:百战汇智(北京)科技有限公司 京公网安备 11011402011233号 京ICP备18060230号-3 营业执照 经营许可证:京B2-20212637