第16天内容

课堂练习:

服务器端和客户端通信:

服务器端

package day16;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerSocketDemo {

	public static void main(String[] args) {

		try {
			ServerSocket ss=new ServerSocket(1234);
			System.out.println("服务启动");
			while(true){
			Socket socket=ss.accept();
			System.out.println("连接进来了");
			/*InetAddress ssadd=socket.getInetAddress();
			String hostname=ssadd.getHostName();
			String addr=ssadd.getHostAddress();
			byte[] bytes=ssadd.getAddress();
			System.out.println("socket.getInetAddress()= "+ssadd+"; ssadd.getHostName()= "+hostname+"; sadd.getHostAddress()= "+bytes);
			int port=socket.getPort();
			System.out.println("正在接受 "+ssadd+": 的请求");*/

			InputStream is=socket.getInputStream();
			OutputStream os= socket.getOutputStream();
			//读取
			BufferedReader br=new BufferedReader(new InputStreamReader(is,"gbk"));
			//写入
			BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os,"gbk"));
			String  line=null;
			while((line=br.readLine())!=null){
				System.out.println("服务端收到数据 "+line);
				String send="Hello "+line+"\r\n";
				bw.write(send);
				bw.flush();
			}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}

客户端:

package day16;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class ClientSocketDemo {

	public static void main(String[] args) {
		try {
			Socket socket=new Socket("localhost", 1234);
			System.out.println("SOCKET");
			//输入
			InputStream is=socket.getInputStream();
			//输出
			OutputStream os= socket.getOutputStream();
			//读取
			BufferedReader br=new BufferedReader(new InputStreamReader(is,"gbk"));
			//写入
			BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os,"gbk"));
			//写入数据
			bw.write("abc! \r\n");
			bw.flush();
			System.out.println("客户端收到数据 "+br.readLine());
			bw.close();
			/*while((line=br.readLine())!=null){
				System.out.println("客户端收到数据 "+line);
				bw.write("abc!");
			}*/
		} catch (Exception e) {
		}
	}

}

运行结果:

/**
 * 服务器端:
 * 服务启动
 * 连接进来了
 * 服务端收到数据 abc! 
 * 
 *
 * 客户端:
 * 客户端收到数据 Hello abc! 
 */

2.QQ服务端GUI界面

3.在分线程中完成ServerSocket推送消息给所有客户端。

List<OutputStream> ... = ;

代码部分(MessageReceiverThread.java)

package day16.QQ_simpleDemo;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

/**
 * 消息接收线程
 * @author a5967
 *
 */
public class MessageReceiverThread extends Thread{

	private QQGUI qqGUI;

	private Socket sock;

	private  List<OutputStream> oslist=new ArrayList<OutputStream>();

	private MessageServer server;

	public  MessageReceiverThread(QQGUI qqGUI,Socket sock){
		this.qqGUI=qqGUI;
		this.sock=sock;
	}

	public  void run(){
		while(true){
			try {
				BufferedReader br=new BufferedReader(new InputStreamReader(sock.getInputStream(), "gbk"));
				String line=null;
				while((line=br.readLine())!=null){

					server=new MessageServer(qqGUI);
					//更新推送的输出流
					server.UpdatOutputStreamList(sock);
					//更新聊天区域
					qqGUI.updateHistory(SocketUtil.getAddr(sock),line);
				}

			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		}

}

代码部分(MessageServer.java)

package day16.QQ_simpleDemo;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class MessageServer {

	private QQGUI qqGUI;

	//客户端集合
	private List<String> clients=new ArrayList<String>();

	//输出流所有含有输出流线程的对象
	private static List<OutputStream> oslist=new ArrayList<OutputStream>();

	public MessageServer(QQGUI qqGUI) {
		this.qqGUI=qqGUI;
	}

	public QQGUI getQqGUI() {
		return qqGUI;
	}

	public void setQqGUI(QQGUI qqGUI) {
		this.qqGUI = qqGUI;
	}

	//启动消息服务器
	public void start(int port){
	try {

			ServerSocket ss=new ServerSocket(port);
			System.out.println("服务器启动");
			//远程的地址
			InetAddress rmaddress;
			//远程端口
			int rmport=0;
			while(true){
			final Socket sock=ss.accept();
			//更新OutpurStream集合
			new MessageReceiverThread(this.qqGUI,sock).start();
			rmaddress=sock.getInetAddress();
			rmport=sock.getPort();
			//添加最新的联系人
			clients.add(rmaddress.getHostName()+" : "+rmport);
			//刷新列表
			qqGUI.addcontact(clients);
			}
	} catch (Exception e) {

	}
	}

	/**
	 * 推送消息
	 * @param string
	 */
	public void pushMessage() {
		try {
			BufferedWriter bw=null;
			int a=oslist.size();
			if(oslist.size()>0){
			for(OutputStream clientos:oslist){
				bw=new BufferedWriter(new OutputStreamWriter(clientos,"gbk"));
				bw.write("有新人进入聊天室 \r\n");
				bw.flush();
				System.out.println("服务端推送数据数据结束");
			}
			}
		}
		 catch (Exception e) {
			e.printStackTrace();
		}

	}
	/**
	 * 更新OutputStream集合
	 * @param sock
	 */
	public void UpdatOutputStreamList(Socket sock) {

		OutputStream os;
		try {
			os = sock.getOutputStream();
			oslist.add(os);
		} catch (IOException e) {
			e.printStackTrace();
		}
		}
}

运行结果:

    /** 
     * 部分运行结果
     * 服务器部分:
     * 服务器启动
     * 服务开始推发送数据 
     * 服务端推送数据数据结束
     * 服务端推发数据完成 
     * 服务开始推发送数据 
     * 服务端推送数据数据结束
     * 服务端推发数据完成 
     * 。。。
     * 
     * 客户端部分(三个客户端为例)
     * 客户端1  第1个连接进入的客户端
     * 您已成功进入聊天室
     * 客户端收到数据 有新人进入聊天室 
     * 客户端收到数据 有新人进入聊天室 
     * 
     * 客户端2  第2个连接进入的客户端
     * 您已成功进入聊天室
     * 客户端收到数据 有新人进入聊天室 
     * 
     * 客户端3  第3个连接进入的客户端
     * 您已成功进入聊天室
     */

4.推送联系人列表给所有客户端。

部分代码:

  /**
     * 推送最新的信息人列表给各个客户端
     * @param newclientlist
     */
	public void pushNewContactList(List<String> newclientlist) {
		try {
			BufferedWriter bw=null;
			int a=oslist.size();
			if(oslist.size()>0){
			for(OutputStream clientos:oslist){
				bw=new BufferedWriter(new OutputStreamWriter(clientos,"gbk"));
				bw.write("当前联系人有\r\n");
				for(String contact:newclientlist){
				bw.write(contact+"\r\n");
				bw.flush();
				}
				System.out.println("服务端推送当前联系人列表数据结束");
			}
			}
		}
		 catch (Exception e) {
			e.printStackTrace();
		}
	}

    /**
     * 部分运行结果
     * 服务器启动
     * 服务开始推发送数据 
     * 服务端推送数据数据结束
     * 服务端推发数据完成 
     * 服务端推送当前联系人列表数据结束
     * 。。。
     * 
     * 
     * 客户端部分(三个客户端为例)
     * 客户端1  第1个连接进入的客户端
     * 您已成功进入聊天室
     * 客户端收到数据 当前联系人有
     * 客户端收到数据 127.0.0.1 : 50709
     * 客户端收到数据 有新人进入聊天室 
     * 客户端收到数据 当前联系人有
     * 客户端收到数据 127.0.0.1 : 50712
     * 客户端收到数据 127.0.0.1 : 50709
     * 客户端收到数据 有新人进入聊天室 
     * 客户端收到数据 当前联系人有
     * 客户端收到数据 127.0.0.1 : 50712
     * 客户端收到数据 127.0.0.1 : 50713
     * 客户端收到数据 127.0.0.1 : 50709
     * 
     * 客户端2  第2个连接进入的客户端
     * 您已成功进入聊天室
     *客户端收到数据 当前联系人有
     *客户端收到数据 127.0.0.1 : 50825
     *客户端收到数据 127.0.0.1 : 50827
     *客户端收到数据 有新人进入聊天室 
     *客户端收到数据 当前联系人有
     *客户端收到数据 127.0.0.1 : 50825
     *客户端收到数据 127.0.0.1 : 50827
     *客户端收到数据 127.0.0.1 : 50828
     *
     * 客户端3  第3个连接进入的客户端
     * 您已成功进入聊天室
     *客户端收到数据 当前联系人有
     *客户端收到数据 127.0.0.1 : 50825
     *客户端收到数据 127.0.0.1 : 50827
     *客户端收到数据 127.0.0.1 : 50828
     */
时间: 2024-10-06 12:30:13

第16天内容的相关文章

嵌入式软件设计第11次实验报告

学号:140201126             姓名:杨鹏飞 组别:第2组                实验地点:D19 一.实验目的: 1.了解短信AT指令的使用方法. 2.掌握使用短信AT指令驱动SIM900A发送和接收短信的方法. 二.实验内容: 1.使用AT命令进行模块测试,发送和接收短信. 2.编写程序利用触摸屏完成固定号码短信的发送和接收.(需要加上AT测试命令模块.手机SIM卡检测模块.手机信号质量检测模块等等.) 三.实验过程描述及结果展示: 短信常用AT指令 程序代码: #

撸代码--linux进程通信(基于共享内存)

1.实现亲缘关系进程的通信,父写子读 思路分析:1)首先我们须要创建一个共享内存. 2)父子进程的创建要用到fork函数.fork函数创建后,两个进程分别独立的执行. 3)父进程完毕写的内容.同一时候要保证子进程退出后,在删除共享内存. 4)子进程完毕读的内容. 效果展示:                 代码展示:           #include <string.h> #include <unistd.h> #include <sys/types.h> #inc

linux系统安全

与系统安全相关的几个文件: /etc/shells //可用shell环境 /etc/passwd //用户账号信息 /etc/shadow //用户密码信息 /etc/group //组信息 /var/log/secure //su日志信息 /etc/sysconfig/network //主机名配置文件 锁定用户密码: usermod -L username passwd -l username 解锁用户密码: usermod -U username passwd -u username p

(转)spring boot注解 [email&#160;protected] 异步调用

原文:http://www.cnblogs.com/azhqiang/p/5609615.html EnableAsync注解的意思是可以异步执行,就是开启多线程的意思.可以标注在方法.类上. 1 @Component 2 public class Task { 3 4 @Async 5 public void doTaskOne() throws Exception { 6 // 同上内容,省略 7 } 8 9 @Async 10 public void doTaskTwo() throws

[Gradle] 在 Eclipse 下利用 gradle 构建系统

转载自:http://www.ibm.com/developerworks/cn/opensource/os-cn-gradle/ 构建系统时候常常要用到 Ant, Maven 等工具,对于初学者来说,它们还是过于复杂,上手还是需要时间的.本文将向读者介绍一种全新的构建项目的方式 gradle,它简单.上手快,能大大节省项目的时间和成本. 在 eclipse 下利用 gradle 构建系统 基本开发环境 操作系统:本教程使用的为 Windows Vista Enterprise, 如果您的系统是

keepalived 高可用配置实例

keepalived 高可用配置单/双 主模型 安装环境  准备2台主机  网络模式 :nat AU   192.168.16.8 (master)       AU1  192.168.16.11(backup) (1)  yum install keepalived -y      service keepalived start       ps -ef ( 2 )   cd /etc/keepalived      cp keepalived.conf keepalived.conf.b

App Store审核指南(中文版)2010版

前言 感谢您付出宝贵的才华与时间来开发iOS应用程程序.从职业与报酬的角度而言,这对于成千上万的开发员来说一直都是一项值得投入的事业.我们希望帮助您加入这个成功的组织.这是我们首次发布<应用程序商店评估指导>(App Store Review Guidelines).通过它,我们希望帮助您解决开发应用程序时遇到的问题,以便于您在提交应用程序时,可以加快审批流程的速度. 我们将应用程序(Apps)视为与书籍或歌曲不同的产品,我们并不存储它们.如果您意欲批评宗教,那就去写本书.如果您想要描述***

JavaScript进阶 - 第6章 事件响应,让网页交互

6-1什么是事件 JavaScript 创建动态页面.事件是可以被 JavaScript 侦测到的行为. 网页中的每个元素都可以产生某些可以触发 JavaScript 函数或程序的事件. 比如说,当用户单击按钮或者提交表单数据时,就发生一个鼠标单击(onclick)事件,需要浏览器做出处理,返回给用户一个结果. 主要事件表: 6-2鼠标单击事件( onclick ) onclick是鼠标单击事件,当在网页上单击鼠标时,就会发生该事件.同时onclick事件调用的程序块就会被执行,通常与按钮一起使

Android开发系列(三):消息模式的Toast.make Text

转自:http://daikainan.iteye.com/blog/1405575 Toast 是一个 View 视图,快速的为用户显示少量的信息. Toast 在应用程序上浮动显示信息给用户,它永远不会获得焦点,不影响用户的输入等操作,主要用于 一些帮助 / 提示. Toast 最常见的创建方式是使用静态方法 Toast.makeText 我使用的是 SDK 2.2 1. 默认的显示方式 Java代码 1 // 第一个参数:当前的上下文环境.可用getApplicationContext()