Java网络编程,多线程,C/S模式

1.会结账的服务器,使用多线程编写一个C/S模式的结账程序。 实验要求如下:
a)参照教材例16-6,编写两个类Client.java(包含main方法)和Server.java(包含main方法)。客户端和服务器建立套接字连接后,客户将如下格式的账单发送给服务器:
"房租:2189元 水费:112.9元 电费:569元 物业费:832元"

服务器接收客户端所发生的信息,计算总费用,并将总费用返回给客户,返回的信息格式如下:
您的账单:
"房租:2189元 水费:112.9元 电费:569元 物业费:832元
总计:3699.9元

b)为服务器编写ServerThread.java线程类。在服务器端,服务器循环监听客户端连接呼叫,与客户端建立连接后,创建并启动ServerThread线程为客户端提供结账服务。

c)使用DataInputStream类作为输入流接收数据(读),使用方法如下:
String readUTF(); //读入一个已使用UTF-8修改版格式编码的字符串

d)使用DataOutputStream类作为输出流进行发送数据,使用方法如下:
void writeUTF(String str); //以机器无关的的方式用UTF-8修改版将一个字符串写到基本输出流。

2个回答

就是最基本的Java Socket编程的应用,自己百度一下资源很多的。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
多线程TCP/IP网络编程
编写一个socket通信程序,win32控制台的,可以发送、接收消息和文件。要多线程。C语言的。 客户端和服务端各要有怎样的思路,求指导! --------------------------- 目前思路大致是,服务端,两个子线程,主线程接受连接,一个子线程发送消息,一个子线程接收消息。 客户端,主线程连接,一个子线程发送消息,一个子线程接收消息。 现在有个问题,连接多个客户端后,客户端发送的消息会乱掉,服务器又怎么分辨客户端给特定的客户端发送消息。 还有,怎么传输文件。
linux C/C++ 多线程编程开启线程的方式
在网上查阅资料的时候,看到关于开启线程的方式有很多种, windows平台和linux平台各不相同, 比如说linux下会用到pthread, 我的问题是,C++标准里面不是提供了标准线程库std::thread,为什么不使用它,以便于跨平台编程呢? 恳请各位指教!
Java编程为什么要用多线程,用多线程是不是会计算加快,加快的原理是什么
Java编程为什么要用多线程,用多线程是不是会计算加快,加快的原理是什么
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?"连接成功":"连接失败"); } } ```
求推荐JAVA 多线程编程书籍
求推荐JAVA 多线程编程书籍
Java编程的多线程,如何实现更好一些?
写了一个网络爬虫程序,每隔10分钟,启动一次爬虫执行。 爬虫程序中,使用了多线程:爬虫程序使用10个线程的多线程,爬取一个指定页面的一些页面数据。 由于每隔10分钟,启动一次爬虫程序,因此,这10个线程就会每10分钟重新生成一次,每天从早晨8:00左右开始,运行了19:30左右时,便就会出现Memroy Overflow的再现。咨询一下大侠,出现如下的错误,有什么好的解决办法? Exception in thread "Thread-690" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOfRange(Unknown Source) at java.lang.String.<init>(Unknown Source) at org.apache.http.util.CharArrayBuffer.toString(CharArrayBuffer.java:461) at org.apache.http.util.EntityUtils.toString(EntityUtils.java:236) at org.apache.http.util.EntityUtils.toString(EntityUtils.java:257) at com.cn.Spilder0721.DownloadBidEntity.getBidEntityFormUrl(DownloadBidEntity.java:102) at com.cn.Spilder0721.BidDataHanding.dataHanding(BidDataHanding.java:23) at com.cn.Spilder0721.BidDataHanding.run(BidDataHanding.java:33)
使用phtread多线程编程程序来生成Fibonacci序列 c/c++
请用c/c++实现以下内容:(多线程) Fibonacci序列是一组:0,1,1,2,3,5,8,…… fib0=0; fib1=1; fibn=fibn-1+fibn-2; 使用phtread多线程编程程序来生成Fibonacci序列。程序应该这样工作:用户运行程序时,在命令行输入要产生Fibonaci序列数,然后程序创建一个新的线程来产生Fibonacci数,把这个序列放到线程共享的数据中(数组可能是一种最方便的数据结构)。当线程执行完成后,父线程将输出子线程产生的序列。由于在子线程结束前,父线程不能开始输出Fibonacci序列,因此,父线程需要等子线程结束。
JAVA网络编程服务器多线程接受套接字,如何能使服务器的静态常量,与客户端的数据进行同步?
服务器Server 客户端CLient Server静态常量num 创建服务器,ServerSocket的端口号为8000,连接套接字。 每创建一个客户端,客户端就创建一个Socket,端口号为8000,与服务器进行连接,与此同时,客户端新建ServerSocket,端口号为3000+Server.num,连接套接字。 服务器与客户端连接后,服务器新建子线程Handler。 子线程Handler,新建ServerSocket,端口号为2000+Server.num,连接套接字。 每当有一个子线程创建,主线程都会加入一个子线程创建的对话界面(显示框,输入框,发送按钮)的选项卡 每当创建一个客户端,客户端都会创建一个对话界面 点击发送时,Hanlder会创建Socket,端口号为3000+Server.num。客户端会创建Socket,端口号为2000+Server.num 这是前提,现在我运行程序,但是当我每当创建一个客户端时,Server.num都不会改变,不知道怎么回事,急求大神解答,感激不尽! 以下是源代码,这里我讲Server.num抽离出去单独做成一个类NUM,每次Handler创建后,调用该类的增加函数numAdd(): 服务器代码: package NewPackage; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; public class Server { private ServerSocket serverSocket; private int PORT = 8000; private Thread workThread; private static MyServer server; public static ArrayList<Socket> solist = new ArrayList<Socket>(); public static ArrayList<MyClient> ctlist = new ArrayList<MyClient>(); public Server() throws Exception { serverSocket = new ServerSocket(PORT); } public void service() { while (true) { Socket socket = null; try { String s; int num = NUM.num; NUM.numadd(); socket = serverSocket.accept(); System.out.println(num + 2000); workThread = new Thread(new Handler(num + 2000, MyServer.jp)); workThread.start(); } catch (Exception e) { e.printStackTrace(); } } } public static void main(String args[]) throws Exception { server = new MyServer(); server.CreateGUI(); new Server().service(); } } 服务器的界面代码: package NewPackage; import java.awt.BorderLayout; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.OutputStream; import java.io.PrintStream; import java.net.Socket; import java.util.ArrayList; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTextArea; public class MyServer extends JFrame { private static final long serialVersionUID = 1L; static JTextArea contentjta; static JScrollPane contentscroll; static JTextArea inputjta; static JScrollPane inputscroll; static JButton button; static JPanel jpanel; static JTabbedPane jp; MyServer() { super("Server Window"); } void CreateGUI() { jp = new JTabbedPane(); this.add(jp, BorderLayout.CENTER); // 将选项卡窗体添加到 主窗体上去 this.setSize(400, 400); this.setLocation(400, 200); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } 子线程Handler package NewPackage; import java.awt.BorderLayout; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import javax.swing.JButton; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTextArea; public class Handler implements Runnable, ActionListener { private Socket socket; private PrintWriter pw; private int order; private ServerSocket svs; private MyClient client; static JTextArea contentjta; static JScrollPane contentscroll; static JTextArea inputjta; static JScrollPane inputscroll; static JButton button; static JPanel jpanel; static JTabbedPane jp; private BufferedReader br; public Handler(int n, JTabbedPane jp) { try { this.jp = jp; // this.socket = socket; // System.out.println("handler" + socket.getLocalPort()); order = n ; // JOptionPane.showInputDialog(this, order); System.out.println("Handler" + order); svs = new ServerSocket(order + 1000); createTab(); } catch (Exception e) { e.printStackTrace(); } } private PrintWriter getWriter(Socket socket) throws IOException { OutputStream socketOut = socket.getOutputStream(); return new PrintWriter(socketOut, true); } private BufferedReader getReader(Socket socket) throws IOException { InputStream socketln = socket.getInputStream(); return new BufferedReader(new InputStreamReader(socketln)); } void createTab() { JPanel chat = new JPanel(new BorderLayout()); contentjta = new JTextArea(10, 30); contentjta.setTabSize(4); contentjta.setFont(new Font("楷体", Font.BOLD, 16)); contentjta.setEditable(false); inputjta = new JTextArea(10, 30); inputjta.setTabSize(4); inputjta.setFont(new Font("楷体", Font.BOLD, 16)); inputjta.setEditable(true); contentscroll = new JScrollPane(contentjta); contentscroll .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); contentscroll .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); inputscroll = new JScrollPane(inputjta); inputscroll .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); inputscroll .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); jpanel = new JPanel(); button = new JButton("发送"); button.addActionListener(this); jpanel.setLayout(new GridLayout(1, 1)); jpanel.add(button); chat.add(contentscroll, BorderLayout.NORTH); chat.add(inputscroll, BorderLayout.CENTER); chat.add(jpanel, BorderLayout.SOUTH); jp.add("aa", chat); jp.setFont(new Font("宋体", Font.BOLD, 20)); } public void run() { try { // 接受信息 while (true) { Socket socket = svs.accept(); br = getReader(socket); pw = getWriter(socket); String msg = null; String s = ""; while ((msg = br.readLine()) != null) { s += msg; if ((msg.equals("bye"))) break; } contentjta.setText(s); } } catch (Exception e) { e.printStackTrace(); } } @Override public void actionPerformed(ActionEvent e) { Object o = e.getSource(); if (o == button) { try { Socket so = new Socket("localhost", order); OutputStream out = so.getOutputStream(); PrintStream pout = new PrintStream(out); pout.print(inputjta.getText()); inputjta.setText(""); out.flush(); out.close(); } catch (Exception ex) { ex.printStackTrace(); } } } }
java多线程编程一定要用sleep方法才能实现吗?
java多线程编程一定要用sleep方法才能实现吗? 我编程时用sleep方法结果正常,但是把sleep方法去掉就乱了,设置flag也没有用。 请帮忙解释下。
Android C/S 实现的一个简单多线程聊天程序
写了一个简单的C/S多线程聊天程序,但是不能将服务器返回的数据显示在Listview上,各位大大帮忙看一下我的程序哪里有问题,拜谢! Server端01: ![Server端01:](https://img-ask.csdn.net/upload/201607/15/1468583764_337021.png) Server端02: ![Server端02:](https://img-ask.csdn.net/upload/201607/15/1468583839_250626.png) Client处理接受消息: ![Client处理接受消息](https://img-ask.csdn.net/upload/201607/15/1468583972_912515.png) ![Client处理接受消息](https://img-ask.csdn.net/upload/201607/15/1468583983_933046.png) Client处理发送消息: ![Client处理发送消息](https://img-ask.csdn.net/upload/201607/15/1468584094_875221.png) ![Client处理发送消息](https://img-ask.csdn.net/upload/201607/15/1468584110_37378.png)
请问JAVA ODBC编程ResultSet多线程的问题
使用ResultSet取得SQL查询的结果,并对每个next进行处理,写入文件中: File c=new File("E:\\test.txt"); FileWriter x = new FileWriter(c); Statement stat = conn.createStatement(); ResultSet resultSet = stat.executeQuery(sql); String result = ""; while(resultSet.next()) { for (int i = 0; i < 100; i++) { result = result + resultSet.getString(DEF_COLUMN(i)); } x.write(result); } ... 然后觉得速度太慢,想要把字符串处理放到线程中(以下简写) LinkedBlockingQueu<String> queue = new LinkedBlockingQueu<String>(20); thread 1: do { String result = ""; for (int i = 0; i < 100; i++) { result = result + resultSet.getString(DEF_COLUMN(i)); } queue.put(result); }while(resultSet.next()); thread2: do { String result = queue.take(); x.write(result); }while(!queue.isEmpty()); 像上面的形式,当thread1开启一个的时候没有问题。但当开启多个thread1时,resultSet在for循环时不能被其他线程执行next否则报错,没办法只能加锁,这样虽然使用了多线程,但thread1被强制转换成单线程,速度并没有多大提升。所以我想问有没有提升resultSet的fetch速度的好方法。 ps:使用ResultSet localSet = reultSet; 尝试了一下,哈哈,localSet只是resultSet的一个引用,并没有把数据复制到localSet中,localSet.next()的时候另一个线程还是会报错。这种办法不可行。
大家谁能介绍一本JAVA多线程的和网络编程的书
大家谁能介绍一本JAVA多线程的和网络编程的书 最好是PDF的,语言不限,E文也行,但是要经典的 谢谢大家了
java多线程问题,java 编程思想书中的例子
在看java编程思想书中的多线程一节,书中对wait,notify,notifyall举了一个例子,模拟给汽车涂蜡和抛光的过程, 因为抛光任务在涂蜡之前是不能尽兴的,反之,涂蜡任务在涂另外一层蜡之前,必须要等抛光任务结束。代码如下: 显示一个汽车类: class Car{ private boolean wanOn=false; public synchronized void waxed(){ waxOn=true; notifyAll(); } public synchronized void buffed(){ waxOn=false; notifyAll(); } public synchronized void waitForWaxing(){ while(waxOn==false){ wait(); } } public synchronized void waitForBuffint(){ while(waxOn==true){ wait; } } } 我想知道为什么在waitForWaxing和waitForBuffint方法中,需要用while循环,而不是 用if来进行判断呢? 谢谢
java程序编程,多线程输入输出流
实现对多个文件的同时写入操作,并显示操作进度 多线程实现查找磁盘中的临时文件,并进行清理,需要有用户登录界面
socket编程多线程文件传输
要实现的是开多线程传输一个文件,目的是提高传输速度。 思路是这样的:服务端开多线程,将文件分割,一个线程传输一块,客户端也开多线程,每个线程接受一块,最后拼成一个完整的文件。服务端支持多线程, 客户端要支持多线程, 然后客户端每个线程都建立连接到服务端请求一个文件的某个分片。 希望大家可以提供一下类似的代码,现在只有思路不知道怎么下手。
linux C/C++ 多线程编程的问题
一个进程中开n个线程,这些线程每个都是read()阻塞的。 如何给他们分配均匀的cpu时间片让他们平等的阻塞等待I/O呢? 希望了解这类函数方法以及实现代码。解决的链接也可,谢谢了
求java多线程教程或图书
如题,求java多线程开发教程,或图书。 目前可见需解决问题,多线程运算,返回结果。
Java网络编程输出有问题
客户端代码 import java.io.*; import java.net.Socket; /** * Created by apple on 17-6-7. * 多线程版本 * 让程序能够支持客户端一边输入一边接收来自服务端的消息 */ public class TCPClient2 { //testClient public static void main(String[] args){ Client sparkClient = new Client("Spark", "127.0.0.1", 8888); } } ​ class Client{ private static int totalNum = 0; //记录连接的客户端总数量 private Socket clientSock; private String userName; //客户端用户名 private final int ID = ++totalNum; //标识客户端唯一的号码,类似QQ号,且一经注册变不可改变 private BufferedReader clientReader; //客户端读入流 private BufferedReader userInputReader; private PrintWriter clientWriter; //客户端向服务端的输出流 private String clientInput; //客户端读入的数据,即从服务端传来的数据 private String userInput; private Thread inputThread = new Thread(new ClientRead()); //监控输入的线程 private Thread outputThread = new Thread(new ClientWrite()); //监控输出的线程 /*public Client(String userName, Socket sock){ //this(userName, (String)sock.getInetAddress(), sock.getPort()); //?????????? clientSock = sock; }*/ public Client(String userName, String ipAddress, int port){ try{ //id = ++totalNum; clientSock = new Socket(ipAddress, port); this.userName = userName; clientReader = new BufferedReader(new InputStreamReader(clientSock.getInputStream())); clientWriter = new PrintWriter(clientSock.getOutputStream(), true); userInputReader = new BufferedReader(new InputStreamReader(System.in)); inputThread.start(); outputThread.start(); System.out.println("Connected, just enjoy the communication!"); } catch (IOException e){ e.printStackTrace(); System.exit(-1); } } public Client(){ this("Durant", "127.0.0.1", 8888); //this((Socket) ("Spark","127.0.0.1", 8888)); } //尝试随机产生类似QQ号的号码,用户名可以重复 protected void finalize(){close();} //getter public Socket getSocket(){ return clientSock; } public int getID (){return ID;} public String getUserName(){return userName;} //public String getClientInput(){return clientInput;} //public BufferedReader getClientReader(){return clientReader;} //public PrintWriter getClientOutput(){return clientWriter;} public String getUserInput(){ //客户端接受用户的输入作为写入服务端的信息 //inputHint(); try{ userInput = userInputReader.readLine(); }catch (IOException e){ e.printStackTrace(); System.exit(-1); } return userInput; } //setter public void setSocket(Socket sock){ clientSock = sock; } public void setUserName(String userName){this.userName = userName;} //从客户端读入来自服务端或用户写入的数据 public String read(){ try { clientInput = clientReader.readLine(); //将服务端写入的数据读入进来 }catch (IOException e){ e.printStackTrace(); System.exit(-1); } return clientInput; } //从客户端写入数据到服务端 public void write(){ getUserInput(); clientWriter.println(userInput); clientWriter.flush(); // clientOutput.flush(); } //将服务端传来的消息打印出来 public void printServerMessage(){ System.out.println("Server:" + clientInput); } public void printClientMessage(){ System.out.println("Client:" + userInput); } public void printServerDisconnected() { System.out.println("Sorry, the server is disconnected!"); } public void printClientDisconnected() { clientWriter.println("User#" + ID + ", " + userName + "is disconnected!"); } public void close(){ try{ clientSock.close(); clientReader.close(); userInputReader.close(); clientWriter.close(); }catch (IOException e){ e.printStackTrace(); System.exit(-1); } } //判断服务器是否仍在连接中 public boolean serverIsConnected(){ return !clientInput.equals("bye"); } public boolean clientIsConnected(){ return !getUserInput().equals("bye"); } //实现线程的方法————时刻准备接收来自服务端的消息 public class ClientRead implements Runnable { public void run() { read(); while (clientReader != null && serverIsConnected() && clientInput.length()!=0) { printServerMessage(); read(); } printServerDisconnected(); } } //实现线程的方法————时刻准备向服务端发送消息 class ClientWrite implements Runnable{ public void run() { write(); while (userInputReader != null && clientIsConnected() && userInput.length()!=0){ //printClientMessage(); write(); } printClientDisconnected(); } } } 服务端代码: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; /** * Created by apple on 17-6-7. * 多线程版本 * 让程序能够支持客户端一边输入一边接收来自服务端的消息 */ public class TCPServer { public static void main(String[] args){ Server sparkServer = new Server("Curry", 8888); } } class Server{ private ServerSocket serverSock; private Socket clientSock; private String serverName; //服务端名 private BufferedReader serverReader; //服务端读入流 private BufferedReader userInputReader; private PrintWriter serverWriter; //服务端向客户端的输出流 private String serverInput; //服务端读入的数据,即从客户端传来的数据 private String userInput; private Thread inputThread = new Thread(new ServerRead()); //监控输入的线程 private Thread outputThread = new Thread(new ServerWrite()); //监控输出的线程 public Server(String serverName, int port){ try{ this.serverName = serverName; serverSock = new ServerSocket(port); clientSock = serverSock.accept(); serverReader = new BufferedReader(new InputStreamReader(clientSock.getInputStream())); userInputReader = new BufferedReader(new InputStreamReader(System.in)); serverWriter = new PrintWriter(clientSock.getOutputStream(), true); inputThread.start(); outputThread.start(); }catch (IOException e){ e.printStackTrace(); System.exit(-1); } } public Server(){ this("SuperQQ", 8888); } protected void finalize(){close();} //getter public ServerSocket getServerSocket(){ return serverSock; } public String getServerName(){return serverName;} public String getUserInput(){ try{ userInput = userInputReader.readLine(); }catch (IOException e){ e.printStackTrace(); System.exit(-1); } return userInput; } //setter public void setServerSocket(ServerSocket serverSock){ this.serverSock = serverSock; } public void setServerSocket(int port){ try{ serverSock = new ServerSocket(port); }catch (IOException e){ e.printStackTrace(); System.exit(-1); } } //接收客户端以及用户在控制台的输入传入服务端 public String read(){ try { serverInput = serverReader.readLine(); //将客户端写入的数据读入进来 }catch (IOException e){ e.printStackTrace(); System.exit(-1); } return serverInput; } //从服务端写入数据到客户端 public void write(){ getUserInput(); serverWriter.println(userInput); serverWriter.flush(); } //将客户端传来的消息打印出来 public void printClientMessage(){ System.out.println("Client:" + serverInput); } //将服务端写的消息打印出来 public void printServerMessage() { System.out.println("Server:" + userInput); } public void close(){ try { serverWriter.close(); userInputReader.close(); serverReader.close(); serverSock.close(); }catch (IOException e){ e.printStackTrace(); System.exit(-1); } } //判断服务器是否仍在连接中 public boolean serverIsConnected(){ return !serverInput.equals("bye"); } public boolean clientIsConnected(){ return !getUserInput().equals("bye"); } //实现线程的方法————时刻准备接收来自客户端的消息 public class ServerRead implements Runnable { public void run() { read(); while (serverReader != null && serverIsConnected() && serverInput.length()!=0) { printClientMessage(); read(); } //printServerDisconnected(); } } //实现线程的方法————时刻准备向服务端发送消息 class ServerWrite implements Runnable{ public void run() { write(); while (userInputReader != null && clientIsConnected() && userInput.length()!=0){ //printServerMessage(); write(); } //printClientDisconnected(); } } }
Java项目中什么时候需要多线程?
Java项目中什么时候需要多线程?比如什么项目中那个模块用到了
相见恨晚的超实用网站
相见恨晚的超实用网站 持续更新中。。。
字节跳动视频编解码面经
三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时想着能进去就不错了,管他哪个岗呢,就同意了面试...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
python学习方法总结(内附python全套学习资料)
不要再问我python好不好学了 我之前做过半年少儿编程老师,一个小学四年级的小孩子都能在我的教学下独立完成python游戏,植物大战僵尸简单版,如果要肯花时间,接下来的网络开发也不是问题,人工智能也可以学个调包也没啥问题。。。。。所以python真的是想学就一定能学会的!!!! --------------------华丽的分割线-------------------------------- ...
python 简易微信实现(注册登录+数据库存储+聊天+GUI+文件传输)
socket+tkinter详解+简易微信实现 历经多天的努力,查阅了许多大佬的博客后终于实现了一个简易的微信O(∩_∩)O~~ 简易数据库的实现 使用pands+CSV实现数据库框架搭建 import socket import threading from pandas import * import pymysql import csv # 创建DataFrame对象 # 存储用户数据的表(...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
Python实例大全(基于Python3.7.4)
博客说明: 这是自己写的有关python语言的一篇综合博客。 只作为知识广度和编程技巧学习,不过于追究学习深度,点到即止、会用即可。 主要是基础语句,如三大控制语句(顺序、分支、循环),随机数的生成,数据类型的区分和使用; 也会涉及常用的算法和数据结构,以及面试题相关经验; 主体部分是针对python的数据挖掘和数据分析,主要先攻爬虫方向:正则表达式匹配,常用数据清洗办法,scrapy及其他爬虫框架,数据存储方式及其实现; 最后还会粗略涉及人工智能领域,玩转大数据与云计算、进行相关的预测和分析。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
JavaScript 为什么能活到现在?
作者 | 司徒正美 责编 |郭芮 出品 | CSDN(ID:CSDNnews) JavaScript能发展到现在的程度已经经历不少的坎坷,早产带来的某些缺陷是永久性的,因此浏览器才有禁用JavaScript的选项。甚至在jQuery时代有人问出这样的问题,jQuery与JavaScript哪个快?在Babel.js出来之前,发明一门全新的语言代码代替JavaScript...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
Python 编程开发 实用经验和技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法和技巧,包括小数保留指定位小数、判断变量的数据类型、类方法@classmethod、制表符中文对齐、遍历字典、datetime.timedelta的使用等,会持续更新......
吐血推荐珍藏的Visual Studio Code插件
作为一名Java工程师,由于工作需要,最近一个月一直在写NodeJS,这种经历可以说是一部辛酸史了。好在有神器Visual Studio Code陪伴,让我的这段经历没有更加困难。眼看这段经历要告一段落了,今天就来给大家分享一下我常用的一些VSC的插件。 VSC的插件安装方法很简单,只需要点击左侧最下方的插件栏选项,然后就可以搜索你想要的插件了。 下面我们进入正题 Material Theme ...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
相关热词 基于c#波形控件 c# 十进制转十六进制 对文件aes加密vc# c#读取栈中所有的值 c# rsa256加密 好 学c# 还是c++ c# 和java的差距 c# curl网络框架 c# https证书请求 c# 中崎
立即提问