java新手笔记33 多线程、客户端、服务器

1.Mouse

package com.yfs.javase;

public class Mouse {

	private int index = 1;
	private boolean isLive = false;
	//跳出方法  同步锁
	public synchronized void jump() {
		while(true) {
			if(!isLive ) {
				System.out.println("跳出第 " + index + " 田鼠");
				//修改田鼠状态
				isLive = true;
				//通知打的线程
				//notify();
			} else {
				//当前线程等待
//				try {
//					wait();
//				} catch (InterruptedException e) {
//					e.printStackTrace();
//				}
			}
		}
	}
	public synchronized void hit() {
		while(true) {
			if(isLive) {
				System.out.println("打掉第 " + index + " 田鼠..");
				index ++;
				isLive = false;
				//notify();//通知放田鼠的线程
			} else {
//				try {
//					//wait();
//				} catch (InterruptedException e) {
//					e.printStackTrace();
//				}
			}
		}
	}

}

2.Producer

package com.yfs.javase;

public class Producer extends Thread {
	private Mouse mouse;

	public Producer(Mouse  mouse) {
		this.mouse = mouse;
	}

	@Override
	public void run() {
		mouse.jump();
	}

}

3.Customer

package com.yfs.javase;

public class Customer extends Thread {
	private Mouse mouse;
	public Customer(Mouse mouse) {
		this.mouse = mouse;
	}

	@Override
	public void run() {
		mouse.hit();
	}

}

4.MouseTest

package com.yfs.javase;

public class MouseTest {

	public static void main(String[] args) {
		Mouse mouse = new Mouse();
		new Producer(mouse).start();
		new Customer(mouse).start();
	}

}

5.Ticket

package com.yfs.javase;

public class Ticket implements Runnable {
	private int index = 100;//共享资源

	//锁机制
	@Override
	public void run() {

		while(index > 0) {
			synchronized (this) {//同步锁  当前对象
				try {
					Thread.sleep(3);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				if(index <= 0) {
					break;
				}
				System.out.println(Thread.currentThread().getName() + "  第  " + index  +  "  票售出");
				index --;
			}

		}

	}

}

6.TicketTest

package com.yfs.javase;

public class TicketTest {

	public static void main(String[] args) {
		Ticket tickets = new Ticket();
		new Thread(tickets,"1号").start();
		new Thread(tickets,"2号").start();
		new Thread(tickets,"3号").start();
		new Thread(tickets,"4号").start();

	}

}

7.IP 地址/主机名称

package com.yfs.javase.net;

import java.net.InetAddress;

public class AddressDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		InetAddress add1 = InetAddress.getLocalHost();
		System.out.println("IP 地址 :" + add1.getHostAddress());
		System.out.println("主机名称 :" + add1.getHostName());

		InetAddress add2 = InetAddress.getByName("www.baidu.com");
		System.out.println("IP 地址 :" + add2.getHostAddress());
		System.out.println("主机名称 :" + add2.getHostName());

	}

}

8.Server1

package com.yfs.javase.net;

import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server1 {

	/**
	 * 启动服务 监听端口
	 */
	public static void main(String[] args) throws Exception {
		ServerSocket server = new ServerSocket(3000);
		//启动
		System.out.println("服务器启动,监听3000端口...");
		Socket socket = server.accept();//监听是否有其他主机连接
        String other = socket.getInetAddress().getHostAddress();
		System.out.println(other + "请求连接...");

		//发送信息   获取输出流
		OutputStream out = socket.getOutputStream();
		out.write(‘a‘);
		out.flush();//刷新
		out.close();
		System.out.println("信息发送完成");

	}

}

9.Client1

package com.yfs.javase.net;

import java.io.InputStream;import java.net.Socket;

public class Client1 {

    /**     * @param args     */    public static void main(String[] args) throws Exception {        Socket socket = new Socket("192.168.1.30", 3000);        //接收信息        InputStream in = socket.getInputStream();        int val = in.read();        System.out.println("val = " + (char)val);        in.close();    }

}

10.Server2

package com.yfs.javase.net;

import java.io.BufferedOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server2 {

	/**
	 * 启动服务 监听端口
	 */
	public static void main(String[] args) throws Exception {
		ServerSocket server = new ServerSocket(3000);
		//启动
		System.out.println("服务器启动,监听3000端口...");
		Socket socket = server.accept();//监听是否有其他主机连接
        String other = socket.getInetAddress().getHostAddress();
		System.out.println(other + "请求连接...");

		//发送信息   获取输出流
		OutputStream out = socket.getOutputStream();
		BufferedOutputStream buf = new BufferedOutputStream(out);
		PrintWriter pw = new PrintWriter(new OutputStreamWriter(buf));
	    pw.println("同学们,你们好! 这是服务器发送的信息....");
	    pw.close();
	    buf.close();
		out.close();
		System.out.println("信息发送完成");
	}

}

11.Client2

package com.yfs.javase.net;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;

public class Client2 {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		Socket socket = new Socket("192.168.1.30", 3000);
		//接收信息
		InputStream in = socket.getInputStream();
		BufferedReader read = new BufferedReader(new InputStreamReader(in));
		String msg = read.readLine();
		System.out.println("服务器说:" + msg);
		read.close();
		in.close();
	}

}

12.Server3

package com.yfs.javase.net;

import java.io.BufferedOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Server3 {

	/**
	 * 启动服务 监听端口
	 */
	public static void main(String[] args) throws Exception {
		ServerSocket server = new ServerSocket(3000);
		//启动
		System.out.println("服务器启动,监听3000端口...");
		Socket socket = server.accept();//监听是否有其他主机连接
        String other = socket.getInetAddress().getHostAddress();
		System.out.println(other + "请求连接...");

		//发送信息   获取输出流
		OutputStream out = socket.getOutputStream();
		BufferedOutputStream buf = new BufferedOutputStream(out);
		PrintWriter pw = new PrintWriter(new OutputStreamWriter(buf));
	    pw.println("同学们,你们好! 这是服务器发送的信息....");
	    pw.flush();
	    Scanner scan = new Scanner(System.in);
	    String msg = null;
	    int i = 1;
	    while(i < 3000) {
	    	msg = scan.next();
	    	pw.println(msg);
	    	pw.flush();
	    	i++;
	    }
	    pw.close();
	    buf.close();
		out.close();
		System.out.println("信息发送完成");
	}

}

13.Client3

package com.yfs.javase.net;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;

public class Client3 {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		Socket socket = new Socket("192.168.1.30", 3000);
		//接收信息
		InputStream in = socket.getInputStream();
		BufferedReader read = new BufferedReader(new InputStreamReader(in));
		String msg = read.readLine();
		System.out.println("服务器说:" + msg);
		int i = 1;
		while(i < 3000) {
			msg = read.readLine();
			System.out.println("服务器说:" + msg);
			i++;
		}
		read.close();
		in.close();
	}

}
时间: 2024-10-13 15:58:27

java新手笔记33 多线程、客户端、服务器的相关文章

java新手笔记34 连接数据库

1.JdbcUtil package com.yfs.javase.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JdbcUtil { private static final String driver = "sun.j

Java学习笔记之多线程二

看到一篇讲线程的故事性文章,觉得很有意思,很佩服作者能这么生动地讲述出来,点击可跳转阅读此文章:<我是一个线程> 继续我的笔记中总结 - - 理解线程安全问题: 下面是书上看到的卖票例子:模拟3个窗口同时在售10张票. 上篇博文笔记总结了多线程创建的两种方式,那我们就分别以这两种实现多线程的方式来解决这个场景. 使用继承于Thread类的方式 上Demo: class SaleTicket extends Thread { int num = 10; // 票数 public SaleTick

简易socket 多线程客户端 服务器

简易客户端: import socket client = socket.socket() client.connect(('localhost',9999)) while True: msg = input('>>:').strip() if len(msg) == 0:continue client.send(msg.encode('utf-8')) data = client.recv(1024) print(data) client.close() 多线程服务器: import soc

Java学习笔记之多线程

/* 进程: 正在进行中的程序(直译). 线程: 就是进程中一个负责程序执行的控制单元(执行路径) 一个进程中可以有多个执行路径, 称之为多线程. 一个进程中至少要有一个线程. 开启多个线程是为了同时运行多部分代码. 每一个线程都有自己运行的内容. 这个内容可以称为线程要执行的任务. 多线程的好处: 解决了多部分同时运行的问题. 多线程的弊端: 线程太多回到效率的降低. 其实应用程序的执行都是cpu在做着快速的切换完成的. 这个切换是随机的. jvm启动时就启动了多个线程,至少有两个线程可以分析

Java学习笔记-8.多线程编程

一.引入线程 1.多线程和多进程的区别 (1)两者粒度不同,进程是由操作系统来管理,而线程则是在一个进程内 (2)每个进程是操作系统分配资源和处理器调度的基本单位,拥有独立的代码.内部数据和状态 而一个进程内的多线程只是处理器调度的基本单位,共享该进程的资源,线程间有可能相互影响 (3)线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担小 2.Thread类:Java的线程是通过java.lang.Thread类来实现,一个Thread对象代表一个线程

黑马程序员——JAVA学习笔记六(多线程)

1,    什么是多线程?一个程序可以执行多个任务,每一个任务称为一个线程,运行多个线程的程序称为多线程程序. 进程:正在进行中的程序(直译). 线程:进程中一个负责程序执行的控制单元(执行路径).   多线程的好处:解决了多部分代码同时运行的问题.多线程的弊端:线程太多,会导致效率的降低. 其实,多个应用程序同时执行都是CPU在做着快速的切换完成的.这个切换是随机的.CPU的切换是需要花费时间的,从而导致了效率的降低 2 ,    创建线程方式:  创建线程方式一:继承Thread类 1.定义

Java读书笔记(3)-多线程(一)

2016-1-1 ch16 多线程 线程概述 Java提供了非常优秀的多线程支持,创建,控制,同步,线程池 线程和进程 进程:独立性,动态性,并发性 线程:进程的组成部分,一个进程可以拥有多个线程,一个线程必须有一个父进程.线程可以拥有自己的堆栈,自己的程序计数器和自己的局部变量,但不拥有系统资源,它与父进程的其他线程共享该进程所拥有的全部资源.一个线程可以创建和撤销另一个线程,同一个进程中多个线程之间可以并发执行. 多线程的优势 较之多进程编程方便,并发性高,性能好 线程的创建和启动 继承Th

Java读书笔记(4)-多线程(二)

2016-1-2 线程通信 传统的线程通信 Object类提供了wait(),notify()和notifyAll三个方法 适用情况:synchronized修饰的同步方法或者synchronized方法 wait():导致当前线程等待,直到其他线程调用该同步监视器的notify()或notifyAll方法来唤醒该线程,调用wait方法后本线程会释放对同步监视器的锁定 notify():唤醒在此同步监视器上等待的单个线程.如果有多个线程在等待,则随机唤醒其中一个 notifyAll():唤醒在此

java新手笔记10 构造器

1.摇奖小程序 package com.yfs.javase; import java.io.IOException; import java.nio.CharBuffer; import java.util.Random; public class Demo1 { /** * 模拟摇奖 */ public static void main(String[] args) { Random ran = new Random(); int[] a = new int[7]; System.out.p