调用private方法抱错
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; /** *发送消息的线程 */ class send extends Thread{ //与客户端对应的socket对象 private Socket socket; public send(Socket socket){ //构造器,用于传递socket this.socket=socket; } @Override public void run() { this.sendMsg(); } //定义发送消息的方法 private void sendMsg(){ //对于消息的发送需要创建两个对象,1.消息的来源:需要创建键盘输入对象 2.需要创建输出流对象 try(Scanner scanner = new Scanner(System.in); PrintWriter pw =new PrintWriter(socket.getOutputStream());){ while(true){ String msg = scanner.nextLine(); pw.println(msg); pw.flush(); } }catch (Exception e){ e.printStackTrace(); } } } /** *接收消息的线程 */ class receive extends Thread{ //创建与客户端对应的socket对象 private Socket socket; public receive(Socket socket){//构造器,用于传递socket this.socket=socket; } @Override public void run() { this.receiveMsg(); } //定义接受消息的方法 private void receiveMsg(){ //创建输入对象流,字节转字符,字符处理流 try(BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()))){ while (true){ String str =br.readLine(); System.out.println("客户端说:"+str); } }catch (Exception e){ e.printStackTrace(); } } } public class ChatSocketSever { public static void main(String[] args) { try(ServerSocket serverSocket = new ServerSocket(8888)){ System.out.println("服务端启动中,等待链接....."); //创建与客户端链接时的socket对象 Socket socket = new Socket(); System.out.println("连接成功!"); //将与客服端对应的socket对象传递给发送消息的线程,并启动该线程 new send(socket).start(); //将与客户端对应的socket对象传递给接受消息的线程,并启动该线程 new receive(socket).start(); }catch (Exception e){ e.printStackTrace(); } } }
老师,想问一个问题,在TelNoteRegex类是校验类,为啥不把方法定义成static类型的,如果定义成static类型的话,以后在Operate中调用不就可以用类名调用了吗,这样不更加方便吗
老师,这文件里面网址打不开能直接发我吗
如图,感谢蔚老师!
老师,直接在A的run方法里创建B的线程对象实现包装,在A类中联合,和课堂讲的区别在哪里呢
class A implements Runnable{ @Override public void run() { Thread t3 =new Thread(new B()); t3.start(); for(int i=0;i<10;i++){ if(i==5){ try { t3.join(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()+": A"+i); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } class B implements Runnable{ @Override public void run() { for(int i=0;i<20;i++){ System.out.println(Thread.currentThread().getName()+" B"+i); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class TestJoinThread { public static void main(String[] args) { Thread t1 = new Thread(new A()); t1.start(); for(int i=0;i<10;i++){ System.out.println(Thread.currentThread().getName()+" "+i); //当主线程迭代因子为2时,并入A线程 if(i==2){ try { t1.join(); } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
老师那里有问题呀
客户端:
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.util.Scanner; public class MutualChatSocketClient { public static void main(String[] args) { try (Socket socket = new Socket("127.0.0.1",8888); Scanner scanner = new Scanner(System.in); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); ) { System.out.println("与服务端连接成功!"); while (true){ //这里一定要注意顺序:客户端先发送消息,再接收服务端的消息 //向服务端发送消息 String clientInput = scanner.nextLine(); pw.println(clientInput); pw.flush(); //接收服务端的消息 System.out.println("服务端说:"+br.readLine()); //服务端想要结束对话 if ("exit".equals(br.readLine())){ break; } } }catch (Exception e){ e.printStackTrace(); System.out.println("客户端启动失败"); } } }
服务端:
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class MutualChatSocketServer { public static void main(String[] args) { System.out.println("服务端启动,监听端口号为8888!"); try (ServerSocket serverSocket = new ServerSocket(8888); Socket socket = serverSocket.accept(); Scanner scanner = new Scanner(System.in); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); ){ System.out.println("与客户端连接成功!"); while (true){ //这里一定要注意顺序:服务端先接收客户端的消息,再发送消息 //接收客户端的消息 System.out.println("客户端说:"+br.readLine()); //客户端想要结束对话 if ("exit".equals(br.readLine())){ break; } //向客户端发送消息 String serverInput = scanner.nextLine(); pw.println(serverInput); pw.flush(); } }catch(Exception e){ e.printStackTrace(); System.out.println("服务端启动失败"); } } }
老师您好,我遇到的问题是,客户端向服务端发送消息后,服务端可以收到,但是服务端向客户端发送消息后,客户端却收不到。问题定位到了是循环体中的if语句,我把if语句都注释掉就可以了,请问老师这里的if语句为什么会影响客户端接收服务端口的消息呢,if的条件不满足的话不是直接就跳过了吗?应该不受影响的啊
老师您好,一个域名不是唯一对应的一个IP地址吗,为什么我显示百度域名的IP地址和视频里面的不一样呢
//守护线程 class Daemon implements Runnable{ @Override public void run() { for (int i = 0; i < 20; i++) { System.out.println(Thread.currentThread().getName()+" "+i); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } //用户线程 class UserThread implements Runnable{ @Override public void run() { //守护线程为用户线程服务 Thread thread1 = new Thread(new Daemon(),"守护线程:"); //设置该对象为守护线程 thread1.setDaemon(true); //启动守护线程 thread1.start(); /* 守护线程会随着用户线程的死亡而死亡 */ for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName()+" "+i); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("用户线程结束"); } } public class DaemonThreadTest { public static void main(String[] args) { //创建用户线程 Thread thread = new Thread(new UserThread(),"用户线程:"); //启动用户线程 thread.start(); try { Thread.sleep(9000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("主线程结束"); } }
控制台输出如下:
用户线程: 0 守护线程: 0 用户线程: 1 守护线程: 1 用户线程: 2 用户线程: 3 守护线程: 2 用户线程: 4 用户线程结束 守护线程: 3 守护线程: 4 守护线程: 5 守护线程: 6 守护线程: 7 守护线程: 8 主线程结束
老师您好,在代码中我的守护线程守护的是用户线程,但是当用户线程死亡后守护线程并没有随之死亡,而是等到主线程结束守护线程才死亡,请问是哪里出现了问题呢?
老师有什么推荐的刷题网站吗
本来可以运行的,不知道出现了什么问题
老师,我输出的v,但是结果是这样,我不是很明白
非常抱歉给您带来不好的体验!为了更深入的了解您的学习情况以及遇到的问题,您可以直接拨打投诉热线:
我们将在第一时间处理好您的问题!
关于
课程分类
百战程序员微信公众号
百战程序员微信小程序
©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园网站维护:百战汇智(北京)科技有限公司 京公网安备 11011402011233号 京ICP备18060230号-3 营业执照 经营许可证:京B2-20212637