Section 15 network and threads
来源:互联网 发布:php zend extension 编辑:程序博客网 时间:2024/06/05 17:09
Port
A port represents a logical connection to a particular piece of software. A number representing an application.
TCP port from 0 to 1023 are reserved for well known services.
Client:
Read data from a Socket:
Socket socket = new Socket("127.0.0.1", 5000);// Chain socket connection stream to a high-level character streamInputStreamReader stream = new InputStreamReader(socket.getInputStream());BufferedReader reader = new BufferedReader(stream);// BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String message = reader.readLine();reader.close();
Write data to a Socket:
Socket socket = new Socket("127.0.0.1", 5000);// Chain socket connection stream. Character to bytes. PrintWriter is the standard choice for writing one String at a time.PrintWriter writer = new PrintWriter(socket.getOutputStream());writer.println("Hello");writer.pirnt("No new line");writer.close();
Server:
ServerSocket serverSocket = new ServerSocket(5000);// This socket is on a different port so server can continue listen on 5000.Socket socket = serverSocket.accept();
Thread:
A thread is a separate thread of execution. A separate call stack.
A runnable is the job for a thread. The runnable interface only has one method run(), which is put at the bottom of the call stack first to run.
A thread state:
runnable: ready to run, wait for JVM scheduler to select.
running:
blocking:
dead:
To make a thread in 3 ways:
public class Threadtest {// Inner Class Runnable 成员内部类class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("In my runnable");}}public static void main(String[] args) {// Override run() in ThreadThread t1 = new Thread() {@Overridepublic void run() {System.out.println("In a thread!");}};t1.start();// Inner class runnable. Calling inner class constructor.Threadtest tt = new Threadtest();Runnable myRunnable = tt.new MyRunnable(); // Threadtest.MyRunnable myRunnable = tt.new MyRunnable();Thread t2 = new Thread(myRunnable);t2.start();// Use RunnableThread t3 = new Thread(new YourRunnable());t3.start();System.out.println("In main");}}class YourRunnable implements Runnable {@Overridepublic void run() {System.out.println("In a your runnable");}}Runnable is an interface, but it can be a reference type.
Thread scheduling is not guaranteed to work in any particular way. You shouldn't rely on it.
After sleep(), the thread becomes runnable. Not immediately running.
synchronized block is atomic.
You can't have two threads entering any of a object's synchronized methods at the same time.Among all synchronized methods, only one synchronized method can be executed at any time.Synchronized methods use its object's lock. Synchronized methods might work on the same instance variables so only one synchronized method is invoking at a time.
Lost Update problem:
int i = balance;balance = i + 1;Thread can switch between two statements.
A simple ChatRoom with GUI code:
Client Code:
public class Client {private JTextArea incoming;private JTextField outgoing;private BufferedReader reader;private PrintWriter writer;private Socket socket;public Client() {JFrame frame = new JFrame("A Simple Chat Client");JPanel mainPanel = new JPanel();incoming = new JTextArea(15, 50);incoming.setLineWrap(true);incoming.setWrapStyleWord(true);incoming.setEditable(false);JScrollPane qScroller = new JScrollPane(incoming);qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);outgoing = new JTextField(20);JButton sendButton = new JButton("Send");sendButton.addActionListener(new SendButtonListener());mainPanel.add(qScroller);mainPanel.add(outgoing);mainPanel.add(sendButton);setUpNetworking();Thread readerThread = new Thread(new IncomingReader());readerThread.start();frame.getContentPane().add(BorderLayout.CENTER, mainPanel);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(600, 500);frame.setVisible(true);}private void setUpNetworking() {try {socket = new Socket("127.0.0.1", 5000);reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));writer = new PrintWriter(socket.getOutputStream());System.out.println("Networking established!");} catch (IOException e) {e.printStackTrace();}}class SendButtonListener implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {String message = outgoing.getText();if(message == null || message.length() == 0) {return;}writer.println(message);if(writer.checkError()) {incoming.append("Server is down! Please close and restart client.");return;} // writer does not throw exception. when server is down, it cannot detect.outgoing.setText("");outgoing.requestFocus();}}class IncomingReader implements Runnable {@Overridepublic void run() {String message = null;try {while ((message = reader.readLine()) != null) {incoming.append(message + "\n");}} catch (IOException e) {return;}}}public static void main(String[] args) {Client client = new Client();}}
Server Code:
public class Server {ServerSocket server;ArrayList<PrintWriter> clientWriters;public Server() {try {server = new ServerSocket(5000);} catch (IOException e) {e.printStackTrace();return;}clientWriters = new ArrayList<PrintWriter>();}public void run() {while (true) {Socket socket;try {socket = server.accept();PrintWriter writer = new PrintWriter(socket.getOutputStream());clientWriters.add(writer);Thread serverThread = new Thread(new ClientHandler(socket));serverThread.start();System.out.println("Got a connection");} catch (IOException e) {e.printStackTrace();}}}class ClientHandler implements Runnable {BufferedReader reader;private ClientHandler(Socket socket) {try {reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));} catch (IOException e) {e.printStackTrace();}}@Overridepublic void run() {String message = null;try {while ((message = reader.readLine()) != null) {sendOutMessage(message);System.out.println("Got message: " + message);}} catch (IOException e) {return;}}private void sendOutMessage(String message) {Iterator<PrintWriter> it = clientWriters.iterator();while (it.hasNext()) {PrintWriter writer = (PrintWriter) it.next();writer.println(message); //writer does not throw exception.//writer.flush();if(writer.checkError()) {System.out.println("Client is down!");it.remove();}}}}public static void main(String[] args) {Server server = new Server();server.run();}}
- Section 15 network and threads
- Processes and Threads Sample
- Threads and Collections
- Processes and Threads
- Threads and Swing
- Threads and Swing
- Using threads and ProgressDialog
- Android------Process and Threads
- Processes and Threads
- Processes and Threads
- Android Processes and Threads
- Processes and Threads
- Processes and Threads
- Processes and Threads
- Processes and Threads
- Processes and Threads[译]
- Processes and Threads
- Processes and Threads
- MagicBox 开箱即用的CommonLISP开发环境
- 给出年、月、日,计算该日是该年的第几天。
- 那些不能错过的Xcode插件
- Sqlite修改数据库表名修改、增加字段
- Sublime Text2使用教程
- Section 15 network and threads
- 联想20VSCTO1WW 五代笔记本,成功安装黑苹果10.10.3
- sqoop 导出 hive分区表 数据到 mysql
- 输入10 个数字,按各个位上的和从小到大排序,如果相同,则按数字从小到大排序。
- linux语句和shell的反复练习
- facebook网络环境模拟工具atc
- java中判断字符串是否为数字的方法的几种方法
- linux0.12之内存管理(2)-再理解分段分页
- 103.在学生结构体数据中寻找最低分数