简单聊天室

Server

package main

import (
	"net"
	"fmt"
		"time"
	"strings"
)

type Client struct {
	C chan string
	Name string
	Addr string
}

var onlineClient=make(map[string]Client)
var message=make(chan string)

func main()  {
	listener,err:=net.Listen("tcp","127.0.0.1:8000")
	if err!=nil {
		fmt.Println(err)
		return
	}
	defer listener.Close()
	go Manager()
	for  {
		conn,err:=listener.Accept()
		if err!=nil {
			fmt.Println(err)
			continue
		}
		go func(conn net.Conn) {
			defer conn.Close()

			addr:=conn.RemoteAddr().String()
			client:=Client{make(chan string),addr,addr}
			onlineClient[addr]=client
			go SendMessageToClient(client,conn)
			message<-MakeMessage(client,"login")

			isQuit:=make(chan bool)

			go func() {
				m:=make([]byte,4096)
				for  {
					n,err:=conn.Read(m)
					if n==0 {
						isQuit<-true
						return
					}
					if err!=nil {
						fmt.Println(err)
						return
					}
					x:=string(m[:n-1])
					if x=="who" {
						conn.Write([]byte("online user\n"))
						for _,user:=range onlineClient{
							conn.Write([]byte(user.Name+" "+user.Addr+"\n"))
						}
					} else if  len(x)>=8 && x[:6]=="rename" {
						newname:=strings.Split(x,"|")[1]
						client.Name=newname
						onlineClient[addr]=client
						conn.Write([]byte("rename successful\n"))
					} else {
						message<-x
					}
				}
			}()

			for  {
				select {
				case <-isQuit:
					delete(onlineClient,addr)
					message<-MakeMessage(client,"logout")
					return
				case <-time.After(time.Second*60):
					delete(onlineClient,addr)
					message<-MakeMessage(client,"timeout leaved")
					return
				}
			}
		}(conn)
	}
}

func Manager()  {
	for  {
		msg:=<-message
		for _,client:=range onlineClient{
			client.C<-msg
		}
	}
}

func SendMessageToClient(client Client,conn net.Conn)  {
	for x:=range client.C{
		conn.Write([]byte(x+"\n"))
	}
}

func MakeMessage(client Client,x string) string {
	return "["+client.Addr+"]"+client.Name+" "+x
}

Client1 Client2

package main

import (
	"net"
	"fmt"
	"io"
	"os"
)

func main()  {
	conn,err:=net.Dial("tcp","127.0.0.1:8000")
	if err!=nil {
		fmt.Println(err)
		return
	}
	defer conn.Close()
	go func() {
		m:=make([]byte,4096)
		for  {
			n,err:=os.Stdin.Read(m)
			conn.Write(m[:n])
			if err!=nil && err!=io.EOF {
				fmt.Println(err)
				continue
			}
		}
	}()
	m:=make([]byte,4096)
	for  {
		n,err:=conn.Read(m)
		fmt.Print(string(m[:n]))
		if err!=nil && err!=io.EOF {
			fmt.Println(err)
			continue
		}
	}
}

 

简易聊天室本次实验的目的是通过以下题目掌握JSP内置对象,包括:request,response,session,application等。 (1)制作简易聊天室,能够实现简单的页面聊天功能。 (2)制作网页计数器,要求相同的窗口内刷新页面访问次数并不增加,并且用图片来显数字。1、 熟悉request、response、session、application、out等内置对象; 2、 选择制作网页计数器程序需准备数字图片;1、进入jsp子目录,编写简易聊天室的JSP程序,聊天室的需要实现的基本功能:输入昵称、聊天。 2.根据功能编写页面代码。二、网页计算器 利用内置对象application <html> <head> <base href="<%=basePath%>"> <title>My JSP 'Counter.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> 您是第位访问者! </body> </html> 简易聊天室本次实验的目的是通过以下题目掌握JSP内置对象,包括:request,response,session,application等。 (1)制作简易聊天室,能够实现简单的页面聊天功能。 (2)制作网页计数器,要求相同的窗口内刷新页面访问次数并不增加,并且用图片来显数字。1、 熟悉request、response、session、application、out等内置对象; 2、 选择制作网页计数器程序需准备数字图片;1、进入jsp子目录,编写简易聊天室的JSP程序,聊
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值