Java制作网络聊天室(section1)

java写聊天室需要用到多线程、IO(输入输出)、网络编程,对此也有初步的认识。


一、多线程

概念:多线程是指一个程序中有多条并发执行的线索,每条线索都被称作一个线程,他们交替执行,彼此间可以通信。

在写聊天室时用户用输入和输出的功能,如果输入和输出都写在主函数没有使用线程,那么程序可能因为等待输入而阻塞,无法输出消息,所以需要用多线程来实现。

注:Java中的多线程是一种抢占机制而不是分时机制。抢占机制指的是有多个线程处于可运行状态,但是只允许一个线程在运行,他们通过竞争的方式抢占CPU。

线程的创建

Thread chaThread = new Thread(){
public void run() {

//run方法中运行的内容不会影响主函数的运行

};

};


二、网络编程

在写聊天室时客户端之间信息传输需要有个中介服务器,通过服务器来传输信息。

服务器端创建服务器

ServerSocket sc = new ServerSocket(port);//port为端口

Socket connect =sc.accept();//Socket类对象为服务器与客户端的连接通道,accept()方法是请求客服端与服务器的连接

客户端创建连接服务器通道

Socket connect = new Socket(host,port);//创建与服务器的连接,参数为ip地址(string)和端口(int)


三、IO输入输出

在写聊天室时需要对服务器和客户端之间进行数据传输,这就需要用到io(输入输出)。

在io包中有字节流的输入输出类分别为java.io.InputStream和java.io.OutputStream

InputStream中有read()方法读取输入内容(每次读一个字节),OutputStream中有whrite(byte[] b)方法来输出b字节数组。

下面程序是用IO对桌面文件的复制粘贴

package com.huaxin.IO;

import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Copy {
	public static void main(String[] args) throws Exception{
		Copy copy = new Copy();
		copy.copyPaste("C:\\Users\\Keen\\Desktop\\类图.png","C:\\Users\\Keen\\Desktop\\类图_副本.png");
	}
	public void copyPaste(String srcPath,String destPath)throws Exception//复制文件的方法(复制文件的路径,目的文件的路径)
	{
		FileInputStream fis = new FileInputStream(srcPath);//创建文件输入流对象
		FileOutputStream fos = new FileOutputStream(destPath);//创建文件输出流对象
		int data = fis.read();//第一次读并记录内容
		//边读边写
		while(data!=-1)
		{
			fos.write(data);
			data = fis.read();
		}
		System.out.println("OK");
		//关闭文件输入输出流
		fis.close();
		fos.close();
	}
}





部分代码如下:client: /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package client; /** * * @author Administrator */ import java.awt.*; import java.io.*; import java.net.*; import java.applet.*; import java.util.Hashtable; public class ClientChat extends Applet implements Runnable { Socket socket=null; DataInputStream in=null; DataOutputStream out=null; InputNameTextField 用户提交昵称界面=null; ChatArea 用户聊天界面=null; Hashtable listTable; Label 提示条; Panel north, center; Thread thread; public void init() { int width=getSize().width; int height=getSize().height; listTable=new Hashtable(); setLayout(new BorderLayout()); 用户提交昵称界面=new InputNameTextField(listTable); int h=用户提交昵称界面.getSize().height; 用户聊天界面=new ChatArea("",listTable,width,height-(h+5)); 用户聊天界面.setVisible(false); 提示条=new Label("正在连接到服务器,请稍等...",Label.CENTER); 提示条.setForeground(Color.red); north=new Panel(new FlowLayout(FlowLayout.LEFT)); center=new Panel(); north.add(用户提交昵称界面); north.add(提示条); center.add(用户聊天界面); add(north,BorderLayout.NORTH); add(center,BorderLayout.CENTER); validate(); } public void start() { if(socket!=null&&in!=null&&out!=null) { try { socket.close(); in.close(); out.close(); 用户聊天界面.setVisible(false); } catch(Exception ee) { } } try { socket = new Socket(this.getCodeBase().getHost(), 6666); in=new DataInputStream(socket.getInputStream()); out=new DataOutputStream(socket.getOutputStream()); } catch (IOException ee) { 提示条.setText("连接失败"); } if(socket!=null) { InetAddress address=socket.getInetAddress(); 提示条.setText("连接:"+address+"成功"); 用户提交昵称界面.setSocketConnection(socket,in,out); north.validate(); } if(thread==null) { thread=new Thread(this); thread.start(); } } public void stop() { try { socket.close(); thread=null; } catch(IOException e) { this.showStatus(e.toString()); } } public void run() { while(thread!=null) { if(用户提交昵称界面.get能否聊天()==true) { 用户聊天界面.setVisible(true); 用户聊天界面.setName(用户提交昵称界面.getName()); 用户聊天界面.setSocketConnection(socket,in,out); 提示条.setText("祝聊天愉快!"); center.validate(); break; } try { Thread.sleep(100); } catch(Exception e) { } } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值