精华内容
下载资源
问答
  • 使用C++实现的一个五子棋系统(基于Socket编程

    千次阅读 多人点赞 2021-07-03 17:08:45
    (2)对于刚开使用Dev-C++,可能在运行这段代码的时候会出现问题: 解决方法是: 打开工具->选择编译选项->在连接器命令行加入如下命令: -lwsock32 以下代码是代码还是存在很多不足的地方,此代码没有基于控制台来...

    准备工作:
    (1)首先创建两个记事本,其目的是用来保存玩家和管理员信息的:
    在这里插入图片描述在这里插入图片描述

    上面的数据都是在运行代码时添加的,使用文件保存测原因就是在模拟一个数据库,将这个文件保存的数据当成是数据库在保存数据,所有管理员对玩家信息的修改等操作都是记录在文件中的;玩家对自己的信息的修改也是记录在文件中的。文件HU.txt是用来辅助文件HUBEIUN.txt进行修改等操作的。
    (2)对于刚开使用Dev-C++,可能在运行这段代码的时候会出现问题:
    在这里插入图片描述
    解决方法是:
    打开工具->选择编译选项->在连接器命令行加入如下命令:
    -lwsock32
    在这里插入图片描述
    以下代码是代码还是存在很多不足的地方,此代码没有基于控制台来写,所以看起来效果比较差,但是基本的功能实现了。
    服务端代码(Server):

    #include<set>
    #include<map>
    #include<cmath>
    #include<ctime>
    #include<stack>
    #include<queue>
    #include<ctime>
    #include<vector>
    #include<cstdio>
    #include<cstdlib>
    #include<iomanip>
    #include<cstring>
    #include<fstream>
    #include<conio.h>
    #include<iomanip>
    #include<iostream>
    #include<algorithm>
    #include<WinSock2.h>
    using namespace std;
    #pragma comment(lib,"ws2_32.lib")
    const int maxx=105;
    char chess_1='#';//玩家1 
    char chess_2='@';//玩家2 或者PC 
    char chess_layout[maxx][maxx];//用来记录棋子 
    char chess[maxx][maxx];//用来客服端和服务端进行棋盘信息的传输 
    int rate[28]={4,6,7,9,11,13,15,17,21,24,27,31,35,39,43,48,53,58,64,69,75,81,88,94,101,108,115,123};//当棋盘中的棋子数量达到一定的程度之后 
    int n;
    string Model; 
    //菜单的选择 
    void Menu_1(){
    	system("color F4");
    	cout<<"***************************************"<<endl;
    	cout<<"*            A -添加玩家              *"<<endl;
    	cout<<"*            DBA-授权管理             *"<<endl;
    	cout<<"*            T-管理信息查询           *"<<endl; 
    	cout<<"*            D-删除玩家信息           *"<<endl; 
    	cout<<"*            U-修改玩家信息           *"<<endl; 
    	cout<<"****************************************"<<endl;
    }
    void Menu_2(){
    	system("color F4");
    	cout<<"***************************************"<<endl;
    	cout<<"*            E-进入游戏               *"<<endl;
    	cout<<"*            Q-退出游戏               *"<<endl;
    	cout<<"****************************************"<<endl;
    }
    //菜单的选择 
    void Select(){
    	system("color F4");
    	cout<<"***************************************"<<endl;
    	cout<<"*            PC-人机对弈              *"<<endl; 
    	cout<<"*            P -玩家对弈              *"<<endl;
    	cout<<"***************************************"<<endl;
    }
    //对棋盘初始化 
    void init_chess_layout(){
    	system("color F4");
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			chess_layout[i][j]=' ';
    		}
    	}
    }
    //判断玩家放置的棋子是否合法 
    int check(int x,int y){
    	system("color F4");
    	if(x>=1&&x<=n&&y>=1&&y<=n&&chess_layout[x][y]!='#'&&chess_layout[x][y]!='@'){
    		return 1;
    	}
    	return 0;
    }
    //棋子的放置位置 
    void Position(int x,int y,int flag){
    	system("color F0");
    	if(chess_layout[x][y]==' '){
    		if(flag==1){
    			chess_layout[x][y]=chess_1;
    			chess[2*x][5*y+1]=chess_1;
    		}else if(flag==2){
    			chess_layout[x][y]=chess_2;
    			chess[2*x][5*y+1]=chess_2;
    		}
    	}
    }
    //判断赢者 
    int Judge_Win(int x,int y,int flag){
    	system("color F0");
    	int win=0;
    	if(flag==1){
    		//行判断 
    		for(int i=1;i<=n;i++){
    			if(chess_layout[x][i]=='#'){
    				win++;
    			}else{
    				win=0;
    			}
    			if(win>=5)break;
    		}
    		if(win>=5){
    			return flag;
    		}
    		win=0;
    		//列判断 
    		for(int i=1;i<=n;i++){
    			if(chess_layout[i][y]=='#'){
    				win++;
    			}else{
    				win=0;
    			}
    			if(win>=5)break;
    		}
    		if(win>=5){
    			return flag;
    		}
    		//斜线判断
    		win=0;
    		//从这条斜线的起始位置判断 
    		//当斜率为正时 
    		int tx=x;
    		int ty=y;
    		while(tx>1&&ty>1){
    			tx--;
    			ty--;
    		} 
    		while(tx<=n&&ty<=n){
    			if(chess_layout[tx][ty]=='#'){
    				win++;
    			}else{
    				win=0;
    			}
    			tx++;
    			ty++;
    			if(win>=5)break;
    		}
    		if(win>=5){
    			return flag;
    		}
    		//当斜率为负时
    		win=0;
    		int rx=x;
    		int ry=y;
    		while(rx>1&&ry<n){
    			rx--;
    			ry++;
    		}
    		while(rx<=n&&ry>=1){
    			if(chess_layout[rx][ry]=='#'){
    				win++;
    			}else{
    				win=0;
    			}
    			rx++;
    			ry--;
    			if(win>=5)break;
    		}
    		if(win>=5){
    			return flag;
    		}
    	}else if(flag==2){
    			//行判断 
    		for(int i=1;i<=n;i++){
    			if(chess_layout[x][i]=='@'){
    				win++;
    			}else{
    				win=0;
    			}
    			if(win>=5)break;
    		}
    		if(win>=5){
    			return flag;
    		}
    		win=0;
    		//列判断 
    		for(int i=1;i<=n;i++){
    			if(chess_layout[i][y]=='@'){
    				win++;
    			}else{
    				win=0;
    			}
    			if(win>=5)break;
    		}
    		if(win>=5){
    			return flag;
    		}
    		//斜线判断
    		win=0;
    		//从这条斜线的起始位置判断 
    		//当斜率为正时 
    		int tx=x;
    		int ty=y;
    		while(tx>1&&ty>1){
    			tx--;
    			ty--;
    		} 
    		while(tx<=n&&ty<=n){
    			if(chess_layout[tx][ty]=='@'){
    				win++;
    			}else{
    				win=0;
    			}
    			tx++;
    			ty++;
    			if(win>=5)break;
    		}
    		if(win>=5){
    			return flag;
    		}
    		//当斜率为负时 
    		win=0;
    		int rx=x;
    		int ry=y;
    		while(rx>1&&ry<n){
    			rx--;
    			ry++;
    		}
    		while(rx<=n&&ry>=1){
    			if(chess_layout[rx][ry]=='#'){
    				win++;
    			}else{
    				win=0;
    			}
    			rx++;
    			ry--;
    			if(win>=5)break;
    		}
    		if(win>=5){
    			return flag;
    		}
    	}
    	return 0; 
    }
    //输出棋盘 
    void Display(){
    	system("color F0");
    	cout<<"    ";
    	for(int i=1;i<=n;i++){
    		cout<<i<<"    "; 
    	}
    	cout<<endl;
    	for(int j=1;j<=n+1;j++){
    		cout<<"   |";
    		for(int i=1;i<=n;i++){
    			cout<<"----|";
    		}
    		if(j==n+1)break;
    		cout<<endl;
    		if((int)log10(j)==1){
    			cout<<j<<" |";
    		}else{
    			cout<<j<<"  |";
    		}
    		for(int i=1;i<=n;i++){
    			if(chess_layout[j][i]=='#'){
    				cout<<" "<<"●"<<" |";
    			}else if(chess_layout[j][i]=='@'){
    				cout<<" "<<"■"<<" |";
    			}else{
    				cout<<"  "<<" "<<" |";
    			}
    		}
    		cout<<endl;
    	}
    	cout<<endl;	
    }
    void Switch_Display_2(){
    	system("color F4");
    	for(int i=0;i<4;i++){
    		chess[0][i]=' ';
    	}
    	int index=4;
    	for(int i=1;i<=n;i++){
    		if(i>=10){
    			chess[0][index]=(char)(i/10+48);
    			chess[0][index+1]=(char)(i%10+48);
    			index++;
    		}else{
    			chess[0][index]=(char)(i+48);
    		}
    		for(int j=index+1;j<=index+4;j++){
    			chess[0][j]=' ';
    		}
    		index=index+5;
    	}
    	cout<<endl;
    	for(int j=1;j<=2*n+1;j++){
    		int indexs=0;
    		for(int i=indexs;i<indexs+3;i++){
    			chess[j][i]=' ';
    		}
    		chess[j][indexs+3]='|';
    		indexs+=4;
    		for(int k=1;k<=n;k++){
    			for(int i=indexs;i<=indexs+3;i++){
    				chess[j][i]='-';
    			}
    			chess[j][indexs+4]='|';
    			indexs+=5;
    		}
    		if(j==2*n+1)break;
    		indexs=0;
    		j++; 
    		if((int)log10(j/2)==1){
    			if(j>=20){
    				chess[j][indexs]=(char)(j/10/2+48);
    				chess[j][indexs+1]=(char)(j/2%10+48);
    				chess[j][indexs+2]=' ';
    		    	chess[j][indexs+3]='|';
    		    	indexs+=4;
    			}else{
    				chess[j][indexs]=(char)(j/2+48);
    				chess[j][indexs+1]=' ';
    				chess[j][indexs+2]=' ';
    		    	chess[j][indexs+2]='|';
    		    	indexs+=3;
    			}
    		}else{
    			if(j>=20){
    				chess[j][indexs]=(char)(j/10/2+48);
    				chess[j][indexs+1]=(char)(j/2%10+48);
    				chess[j][indexs+2]=' ';
    				chess[j][indexs+3]=' ';
    				chess[j][indexs+4]='|';
    				indexs+=5;
    			}else{
    				chess[j][indexs]=(char)(j/2+48);
    				chess[j][indexs+1]=' ';
    				chess[j][indexs+2]=' ';
    				chess[j][indexs+3]='|';
    				indexs+=4;
    			}
    		}
    		for(int i=1;i<=n;i++){
    			chess[j][indexs+1]=' ';
    			chess[j][indexs+2]=' ';
    			chess[j][indexs+3]=' ';
    			chess[j][indexs+4]='|';
    			indexs+=5;
    		}
    	}
    }
    void init_chess(){
    	system("color F4");
    	for(int i=0;i<2*n+2;i++){
    		for(int j=0;j<6*n+2;j++){
    			chess[i][j]=' ';
    		}
    	}
    	Switch_Display_2();
    }
    
    //判断棋盘是否放满 
    int OverFlow(){
    	system("color F0");
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			if(chess_layout[i][j]==' '){
    				return 1;
    			}
    		}
    	}
    	return 0;
    }
    //查找整个棋盘可以放置棋子的个数 
    int chess_num(){
    	system("color F0");
    	int num=0;
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			if(chess_layout[i][j]==' '){
    				num++;
    			}
    		}
    	}
    	return num;
    }
    //查找为空的位置 
    int findposition(){
    	system("color F0");
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			if(chess_layout[i][j]==' '){
    				return i,j;
    			}
    		}
    	}
    }
    	/*
        0 = 黑色       8 = 灰色
        1 = 蓝色       9 = 淡蓝色
        2 = 绿色       A = 淡绿色
        3 = 浅绿色     B = 淡浅绿色
        4 = 红色       C = 淡红色
        5 = 紫色       D = 淡紫色
        6 = 黄色       E = 淡黄色
        7 = 白色       F = 亮白色
        */
    
    string manager_id="19103001";
    string manager_name="张文豪";
    struct DBA{
    	int vis_id;
    	string ID;
    	string name;
    	string code_word; 
    	DBA(){
    		vis_id=0;
    	}
    }dba[maxx];
    fstream fin;
    fstream fout;
    int man_num=0;//玩家数量 
    map<string ,string>mp;
    set<string>st; 
    //添加玩家 
    void ADD_player(string id,string code_word,string name){
    	system("color F1");
    	if(st.find(id)!=st.end()){
    		cout<<"该用户已经存在!请重新输入!"<<endl;
    		return ;
    	}
    	mp[name]=id;
    	st.insert(id);
    	dba[++man_num].ID=id;
    	dba[man_num].name=name;
    	dba[man_num].code_word=code_word;
    	fout.open("D:\\HUBEIUN.txt",ios_base::app);
    	fout<<0<<" "<<id<<" "<<code_word<<" "<<" "<<name<<endl;
    	fout.close();
    	cout<<"添加玩家成功!"<<endl;
    }
    /*
    19103001 
    张文豪
    */
    //超级管理员给二级管理员授权 
    //超级管理员给二级管理员授权 
    void Empower(string id,string code_word,string name){
    	system("color F1");
    	int flag=0;
    	for(int i=1;i<=man_num;i++){
    		if(dba[i].ID==id&&dba[i].name==name&&dba[i].code_word==code_word){
    			dba[i].vis_id=1;
    			flag=1;
    			break;
    		}
    	}
    	if(flag==0){
    		cout<<"授权失败!请重新输入"<<endl;
    		return ;
    	}
    	fstream fin_s;
    	fstream fout_s;
    	fin.open("D:\\HUBEIUN.txt",ios_base::in);
    	fout_s.open("D:\\HU.txt",ios_base::out);
    	string str;
    	string index="";
    	string id_1="";
    	string name_1="";
    	str=index.append("1").append(" ").append(id).append(" ").append(code_word).append(" ").append(name);
    	string estr="";
    	char tt[maxx];
    	while(fin.getline(tt,100)){
    		estr="";
    		for(int i=0;i<strlen(tt);i++){
    			estr+=tt[i];
    		}
    		id_1="";
    		for(int i=2;i<10;i++){
    			id_1+=estr[i];
    		}
    		if(id_1==id){
    			fout_s<<str<<endl;
    		}else{
    			fout_s<<estr<<endl;
    		}
    	}
    	fin.close();
    	fout_s.close();
    	string Data;
    	fin_s.open("D:\\HU.txt",ios_base::in);
    	fout.open("D:\\HUBEIUN.txt",ios_base::out);
    	char et[maxx];
    	while(fin_s.getline(et,100)){
    		Data="";
    		for(int i=0;i<strlen(et);i++){
    			Data+=et[i];
    		}
    		fout<<Data<<endl;
    	}
    	cout<<"授权成功!"<<endl;
    	fin_s.close();
    	fout.close();
    }
    //管理员查询玩家的信息
    void Query_player(){
    	system("color F1");
    	cout<<"----------------------------------------------------------------"<<endl;
    	cout<<"是否为二级管理员  | 玩家账号     |     玩家密码    |    玩家姓名"<<endl; 
    	cout<<"----------------------------------------------------------------"<<endl;
    	map<string,string>::iterator it;
    	for(int i=1;i<=man_num;i++){
        	cout<<"      "<<dba[i].vis_id<<"           |"<<" "<<dba[i].ID<<"     |       "<<dba[i].code_word<<"    |    "<<dba[i].name<<endl;
    	} 
    	cout<<"----------------------------------------------------------------"<<endl;
    } 
    //查询指定的玩家信息
    int Find_player(string id,string code_word){
    	system("color F1");
    	for(int i=1;i<=man_num;i++){
    		if(dba[i].ID==id&&dba[i].code_word==code_word){
    			return i;
    		}
    	}
    	return 0;
    } 
    //修改
    void Update(int index,string id,string code_word,string name){
    	system("color F1");
    	fstream fin_s;
    	fstream fout_s;
    	fin.open("D:\\HUBEIUN.txt",ios_base::in);
    	fout_s.open("D:\\HU.txt",ios_base::out);
    	string str;
    	string index_str="";
    	string indexs="";
    	string indext="";
    	if(dba[index].vis_id==1){
    		str=indexs.append("1").append(" ").append(dba[index].ID).append(" ").append(dba[index].code_word).append(" ").append(dba[index].name);
    		index_str=indext.append("1").append(" ").append(id).append(" ").append(code_word).append(" ").append(name);
    	}else{
    		str=indexs.append("0").append(" ").append(dba[index].ID).append(" ").append(dba[index].code_word).append(" ").append(dba[index].name);
    		index_str=indext.append("0").append(" ").append(id).append(" ").append(code_word).append(" ").append(name);
    	}
    	string estr="";
    	string stdc="";
    	char tt[maxx];
    	while(fin.getline(tt,100)){
    		estr="";
    		for(int i=0;i<strlen(tt);i++){
    			estr+=tt[i];
    		}
    		stdc="";
    		for(int i=0;i<estr.length();i++){
    			stdc+=estr[i];
    		}
    		if(stdc==str){
    			fout_s<<index_str<<endl;
    		}else{
    			fout_s<<estr<<endl;
    		}
    	}
    	fin.close();
    	fout_s.close();
    	string Data;
    	fin_s.open("D:\\HU.txt",ios_base::in);
    	fout.open("D:\\HUBEIUN.txt",ios_base::out);
    	char ty[maxx];
    	while(fin_s.getline(ty,100)){
    		Data="";
    		for(int i=0;i<strlen(ty);i++){
    			Data+=ty[i];
    		}
    		fout<<Data<<endl;
    	}
    	fin_s.close();
    	fout.close();
    } 
    //玩家修改信息
    int Player_Update(string id,string code_word,string name){
    	system("color F1");
    	int index;
    	int flag=0; 
    	for(int i=1;i<=man_num;i++){
    		if(dba[i].ID==id&&dba[i].code_word==code_word&&dba[i].name==name){
    			index=i;
    			flag=1;
    		}
    	}
    	if(flag==1){
    		cout<<"请玩家输入新的密码和姓名(code/name): ";
    		string code_word_1;
    		string name_1;
    		cin>>code_word_1>>name_1;
    		Update(index,id,code_word_1,name_1);
    		cout<<"玩家修改个人信息成功!"<<endl;
    		return 1;
    	}else{
    		cout<<"密码或者账户错误! 请玩家重新输入个人账号 密码和姓名!"<<endl;
    		return 0;
    	} 
    } 
    //首选需要输入超级管理员的身份,查看当前二级管理员(或普通玩家)并作修改 
    void Manager(){
    	system("color F1");
    	string id_1;
    	string name_1;
    	string code_word="";
    	int flag_1=0;
    	int flag_2=0; 
    	cout<<"请问您需要查看当前二级管理员的信息吗?(YES(yes) or NO(no)): ";
    	cin>>flag_1;
    	if(flag_1==1){
    		cout<<"------------------------------"<<endl;
    		cout<<"二级玩家账号   |   玩家姓名   "<<endl;
    		cout<<"------------------------------"<<endl;
    		for(int i=1;i<=man_num;i++){
    			if(dba[i].vis_id==1){
    				cout<<dba[i].ID<<"       |      "<<dba[i].name<<endl;
    			}
    		} 
    		cout<<"------------------------------"<<endl;
    	}
    	cout<<"请问您需要查看当前普通玩家的信息吗?(YES(yes) or NO(no)): ";
    	cin>>flag_2; 
    	if(flag_2==1){
    		Query_player();
    	}
    	cout<<"请问您需要修改玩家信息吗?(yes(YES) or no(NO))"<<endl;
    	string flag;
    	cin>>flag;
    	if(flag=="no"||flag=="NO"){
    		return ;
    	}else{
    		cout<<"请输入需要修改的玩家账号(id): ";
    		cin>>id_1;
    		map<string,string>::iterator it;
    		for(int i=1;i<=man_num;i++){
    			if(dba[i].ID==id_1){
    				cout<<"请输入修改之后的玩家姓名和密码(code/name): ";
    				cin>>code_word>>name_1;
    				cout<<"请问您确定要修改玩家的信息吗?(YES(yes) or NO(no))"<<endl;
    				string rt;
    				cin>>rt;
    				if(rt=="YES"||rt=="yes"){
    					for(it=mp.begin();it!=mp.end();it++){
    						if(it->second==id_1){
    							mp.erase(it);
    							mp[name_1]=it->second;
    							Update(i,id_1,code_word,name_1);
    							dba[i].code_word=code_word;
    							dba[i].name=name_1;
    							cout<<"修改玩家信息成功!"<<endl;
    							break;
    						}
    					}
    					return ;
    				}else{
    					return ;
    				}	
    			}
    		} 
    	}
    }
    //请求帮助
    void G(){
    	system("color F2");
    	cout<<"*****************************************************************"<<endl;
    	cout<<"| 同一种棋子必须在同一行或同一列或同一斜线的数等于5(包括大于5),|"<<endl;
    	cout<<"| 先达到的一方获胜.                                             |"<<endl;
    	cout<<"*****************************************************************"<<endl;
    }
    void Code_Accounts(){
    	system("color F2");
    	cout<<"******************************************************************"<<endl;
    	cout<<"|          账户的位数必须是8位的数字或者大小字母混合.            |"<<endl;
    	cout<<"|          密码的位数必须是6位的数字或者大小字母混合.            |"<<endl;
    	cout<<"******************************************************************"<<endl;
    }
    void Help(){
    	system("color F2");
    	cout<<"以下是可能您要找的内容"<<endl; 
    	cout<<"---------------------------------------------"<<endl;
    	cout<<"                G-游戏规则                   "<<endl;
    	cout<<"                CA-账号8位                   "<<endl;
    	cout<<"---------------------------------------------"<<endl;
    } 
    //选择要对弈的玩家 ,如果匹配成功,则返回1,否则返回0 
    int Match_player(string name){
    	system("color F1");
    	for(int i=1;i<=man_num;i++){
    		if(dba[i].name==name){
    			cout<<"匹配成功!开始游戏!"<<endl;
    			return 1;
    		}
    	}
    	return 0;
    }
    //判断是不是一级管理员 
    int One_Manager(string id,string code_word,string name){
    	system("color F1");
    	if(id==manager_id&&name==manager_name&&code_word=="123456"){
    		return 1;
    	}
    	return 0;
    }
    //判断是不是二级管理员  
    int Judge_second_manager(string id,string code_word,string name){
    	system("color F1");
    	for(int i=1;i<=man_num;i++){
    		if((dba[i].ID==id&&dba[i].name==name&&dba[i].code_word==code_word)){
    			return 1;
    		}
    	}
    	return 0;
    }
    //查询玩家姓名
    void query_name(){
    	system("color F1");
    	map<string,string>::iterator it;
    	it=mp.begin();it++;
    	for(;it!=mp.end();it++){
    		cout<<it->first<<endl;
    	}
    } 
    //超级管理员对玩家的信息进行删除
    void Delete_player(string id,string code_word,string name){
    	system("color F1");
    	map<string,string>::iterator it;
    	it=mp.begin();it++;
    	for(;it!=mp.end();it++){
    		if(it->second==id){
    			mp.erase(it);
    			break;
    		}
    	}
    	int index=1;
    	for(int i=1;i<=man_num;i++){
    		if(dba[i].ID==id){
    			index=i;
    			break;
    		}
    	}
    	for(int i=index;i<man_num;i++){
    		dba[i]=dba[i+1];
    	}
    	fstream fin_s;
    	fstream fout_s;
    	fin.open("D:\\HUBEIUN.txt",ios_base::in);
    	fout_s.open("D:\\HU.txt",ios_base::out);
    	string str;
    	string indexs="";
    	string id_1="";
    	string name_1="";
    	if(dba[index].vis_id==1){
    		str=indexs.append("1").append(" ").append(id).append(" ").append(code_word).append(" ").append(name);
    	}else{
    		str=indexs.append("0").append(" ").append(id).append(" ").append(code_word).append(" ").append(name);
    	}
    	string estr="";
    	char tt[maxx];
    	while(fin.getline(tt,100)){
    		for(int i=0;i<strlen(tt);i++){
    			estr+=tt[i];
    		}
    		if(!estr.compare(str)){
    			continue;
    		}
    		fout_s<<estr<<endl;
    	}
    	fin.close();
    	fout_s.close();
    	string Data;
    	fin_s.open("D:\\HU.txt",ios_base::in);
    	fout.open("D:\\HUBEIUN.txt",ios_base::out);
    	char ty[maxx];
    	while(fin_s.getline(ty,100)){
    		Data="";
    		for(int i=0;i<strlen(ty);i++){
    			Data+=ty[i];
    		}
    		fout<<Data<<endl;
    	}
    	fin_s.close();
    	fout.close();
    	cout<<"删除成功!"<<endl;
    }
    //将文件中的数据存储到数组中
    void Switch(){
    	system("color F2");
    	char data[100];
    	string id="";
    	string name="";
    	string vis="";
    	string code_word="";
    	fin.open("D:\\HUBEIUN.txt",ios_base::in);
    	while(!fin.eof()){
    		fin.getline(data,100);
    		id="";
    		name="";
    		code_word="";
    		for(int i=2;i<10;i++){
    			if(data[i]!=' '){
    				id+=data[i];
    			}
    		}
    		for(int i=11;i<=16;i++){
    			code_word+=data[i];
    		} 
    		for(int i=17;i<strlen(data);i++){
    			if(data[i]!=' '){
    				name+=data[i];
    			}
    		}
    		dba[++man_num].ID=id;
    		dba[man_num].name=name;
    		dba[man_num].code_word=code_word;
    		if(data[0]=='1'){
    			dba[man_num].vis_id=1;
    		}else{
    			dba[man_num].vis_id=0;
    		}
    		mp[name]=id;
    		st.insert(id);
    	}
    	fin.close();
    } 
    //超级管理员拥有的权力 
    void Manager_1(){
    	system("color F1");
    	string flag;
    	string begin="";
    	int overflow=0; 
    	string win="";
    	string id_1;
    	string name_1;
    	string mag_id;
    	string mag_name;
    	string manager_1;
    	string manager_2;
    	cout<<"添加玩家: ";
    	string T1;
    	string code_word;
    	cin>>T1;
    	if(T1=="A"){
    		cout<<"请问您需要添加玩家吗?(YES(yes) or NO(no): ";
    		string sym;
    		cin>>sym;
    		int flags=0;
    		if(sym=="YES"||sym=="yes"){
    			while(true){
    				cout<<"请输入要添加的玩家账号 密码和姓名: ";
    				cin>>id_1>>code_word>>name_1;
    				ADD_player(id_1,code_word,name_1);
    				cout<<"请问您还需要添加玩家吗?(YES(yes) or NO(no): ";
    				string sym;
    				cin>>sym;
    				if(sym=="YES"||sym=="yes"){
    					continue;
    				}else{
    					break;
    				}
    			}
    		}
        }		
        /*
        19103001 张文豪 
        */
    	cout<<"授权管理: ";
    	string T2;
    	cin>>T2;
    	if(T2=="DBA"){
    		while(true){
    			string id_mag,name_mag;
    			string id_player,name_player;
    			cout<<"请输入要授权的玩家身份(id/code/name): ";
    			cin>>id_player;
    			cin>>code_word;
    			cin>>name_player; 
    			Empower(id_player,code_word,name_player);
    			cout<<"请问您要继续操作吗?(YES(yes) or NO(no)): ";
    			string flag_2;
    			cin>>flag_2;
    			if(flag_2=="YES"||flag_2=="yes"){
    				continue;
    			}else if(flag_2=="NO"||flag_2=="no"){
    				break;
    			}
    		}
    	} 
    	cout<<"修改玩家信息查询: ";
    	string T3;
    	cin>>T3;
    	if(T3=="U"){
    		while(true){
    			cout<<"是否进行管理信息查询(YES(yes) or NO(no): ";
    			string sym;
    			cin>>sym;
    			if(sym=="YES"||sym=="yes"){
    				Manager();
    			}else if(sym=="no"||sym=="NO"){
    				break;
    			}
    		}
    	}
    	map<string,string>::iterator it;
    	for(it=mp.begin();it!=mp.end();it++){
    		fout<<it->second<<" "<<it->first<<endl;
    	}
    	cout<<"管理信息查询: ";
    	string T6;
    	cin>>T6;
    	if(T6=="T"){
    		Query_player();
    	}
    	cout<<"删除玩家信息: ";
    	string T7;
    	cin>>T7;
    	if(T7=="D"){
    		cout<<"请输入玩家的身份(id/code/name): ";
    		string del_id;
    		string del_name;
    		while(true){
    			cin>>del_id>>code_word>>del_name;
    			Delete_player(del_id,code_word,del_name);
    			cout<<"是否继续操作?(YES(yes) or NO(no)): ";
    			string del;
    			cin>>del;
    			if(del=="YES"||del=="yes"){
    				continue;
    			}else{
    				break;
    			}
    		}
    	}
    }
    //二级管理员拥有的权力 
    void Manager_2(){
    	system("color F3");
    	cout<<"管理信息查询: ";
    	string T6;
    	cin>>T6;
    	if(T6=="T"){
    		while(true){
    			cout<<"请输入管理员信息: ";
    			string T_id;
            	string T_name;
    			cin>>T_id>>T_name;
    			Query_player();
    		}
    	}
    }
    void One_manager_operation(){
    	system("color F1");
    	Menu_1();
    	string id;
    	string name;
    	string code_word;
    	//  Judge_second_manager
    	cout<<"请问您需要选择身份吗?(超级管理员/二级管理员)(yes(YES) or NO(no)): ";
    	string tt;
    	cin>>tt;
    	if(tt=="no"||tt=="NO"){
    		return ;
    	}
    	while(true){
    		cout<<"请输入您的账号 密码和姓名: ";
    		cin>>id>>code_word>>name;
    		if(One_Manager(id,code_word,name)){
    			Manager_1(); 
    			cout<<endl;
    		}else if(Judge_second_manager(id,code_word,name)){
    			Manager_2(); 
    			cout<<endl;
    		}
    		cout<<"请问您还需要继续上述操作吗?(YES(yes) or NO(no)): ";
    		string log;
    		cin>>log;
    		if(log=="YES"||log=="yes"){
    			continue;
    		}else{
    			break;
    		}
    	} 
    }
    int Log(){
    	system("color F2");
    	string id_1;
    	string name_1;
    	Switch();
    	int Log_flag=0;
    	int Log_cnt=0;
    	string code_word="";
    	cout<<"                  登录                "<<endl;
    	while(true){
    		cout<<"账号: ";
    		cin>>id_1;
    		cout<<"密码: ";
    		cin>>code_word;
    		cout<<"姓名: ";
    		cin>>name_1;
    		Log_cnt++;
    		int flag=0;
    		for(int i=1;i<=man_num;i++){
    			if(dba[i].ID==id_1&&dba[i].code_word==code_word&&dba[i].name==name_1){
    				flag=1;
    				break;
    			}
    		}
    		if(flag==0){
    			if(Log_cnt==3){
    				cout<<"抱歉,您已输入过三次,您将没有机会输入!"<<endl;
    				Log_flag=1;
    				break;
    			}
    			cout<<"您输入的账号或者姓名错误!"<<endl;
    			cout<<"您还有"<<3-Log_cnt<<"次登录机会,"<<"请重新输入您的账号和姓名!"<<endl;
    			continue;
    		}else{
    			cout<<"登录成功!"<<endl;
    			break;
    		}
    	}
    	cout<<endl;
    	if(Log_flag==0){
    		One_manager_operation();
    	}else{
    		cout<<"您不能再登录此系统!"<<endl;
    		return 0;
    	}
    		
    }
    int Sever(){
    	system("color F1");
    	string name;
    	string flag;
    	//初始化WSA
    	init_chess_layout();
    	init_chess();
    	WORD sockVersion = MAKEWORD(2, 2);
    	WSADATA wsaData;
    	if (WSAStartup(sockVersion, &wsaData) != 0) {
    		return 0;
    	}
    	//创建套接字,构造监听SOCKET,SOCKET 
    	SOCKET slisten =socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    	if (slisten == INVALID_SOCKET) {
    		cout << "socket error!" << endl;
    		return 0;
    	}
    	//绑定IP和端口
    	sockaddr_in sin;
    	sin.sin_family = AF_INET;
    	sin.sin_port = htons(4443);
    	sin.sin_addr.S_un.S_addr = INADDR_ANY;
    	if (bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) {
    		cout << "bind error" << endl;
    		return 0;
    	}
    	//绑定成功之后开始监听
    	if (listen(slisten, 5) == SOCKET_ERROR) {
    		cout << "listen error" << endl;
    		return 0;
    	}
    	SOCKET sClient;
    	Switch_Display_2();
    	sockaddr_in remoteAddr;
    	int nAddrlen = sizeof(remoteAddr);
    	char revData[2550];
    	//循环接收数据
    	while (true) {
    		while(true){
    			cout<<"请输入要匹配的玩家姓名: ";
    	    	cin>>name;
    	    		init_chess_layout();
                	init_chess();
    				if(Match_player(name)){
    				int win_1[5];
    	        	int win_2[5];
    	        	memset(win_1,0,sizeof(win_1));
    	        	memset(win_2,0,sizeof(win_2));
    				while(true){
    					init_chess_layout();
    			    	init_chess();
    			    	memset(revData,0,sizeof(revData));
    					cout << "等待玩家1输入..." << endl;
    					sClient = accept(slisten, (SOCKADDR*)&remoteAddr, &nAddrlen);
    					if (sClient == INVALID_SOCKET) {
    						cout << "accept error!" << endl;
    						continue;
    					}
    					int st=0;
    					while(true){
    						int x,y;
    						int tag[5];
    						memset(tag,0,sizeof(tag));
    						if(!OverFlow())break;
    						memset(revData,0,sizeof(revData));
    						cout << "等待玩家1输入..." << endl;
    						sClient = accept(slisten, (SOCKADDR*)&remoteAddr, &nAddrlen);
    						if (sClient == INVALID_SOCKET) {
    							cout << "accept error!" << endl;
    							continue;
    						}
    						//接收数据
    						printf("接收到一个连接: %s \r\n", inet_ntoa(remoteAddr.sin_addr));
    						int ret = recv(sClient, revData, 2550, 0);
    						n=0;
    						
    						if(ret!=0){
    							for(int i=0;i<strlen(revData)-2;i++){
    								if(revData[i]>='0'&&revData[i]<='9'){
    									int index=revData[i]-'0';
    									if(index>n){
    										n=index;
    									}
    								}
    								if(revData[i]=='P'){
    									cout<<endl;
    								}else{
    									cout<<revData[i];
    								}
    							}
    						}
    						
    						int i=0,j=0;
    						for(int k=0;k<strlen(revData);k++){
    							if(revData[k]=='P'){
    								i++;
    								j=0;
    							}else{
    								chess[i][j]=revData[k];
    								j++;
    							}
    						}
    						
    						for(int i=1;i<=n;i++){
    							for(int j=1;j<=n;j++){
    								if(chess[2*i][5*j+1]=='#'||chess[2*i][5*j+1]=='@'){
    									chess_layout[i][j]=chess[2*i][5*j+1];
    								}else{
    									chess_layout[i][j]=' ';
    								}
    							}
    						}
    						//发送数据s
    						cout<<endl;
    						while(true){
    							Display();
    							int x,y;
    							cout<<"玩家2输入坐标: ";
    							cin>>x>>y;
    							if(check(x,y)){
    								Position(x,y,2);
    								tag[0]=Judge_Win(x,y,2);
    								if(tag[0]==2){
    									win_2[0]++;
    								}else if(tag[0]==1){
    									win_1[0]++;
    								}
    						    	system("cls");
    						    	break;
    							}else{
    								system("cls");
    								cout<<"玩家2输入的坐标不合法"<<endl;
    							}
    						}
    						Display();
    						char sendData[1024];
    						memset(sendData,0,sizeof(sendData));
    						int k=0;
    						for(int i=0;i<2*n+2;i++){
    							for(int j=0;j<6*n+2;j++){
    								if(chess[i][j]!='\0'){
    									sendData[k++]=chess[i][j];
    								}else{
    									sendData[k++]=' ';
    								}
    							}
    							sendData[k++]='P';
    						}
    						cout << endl;
    						send(sClient, sendData, strlen(sendData), 0);
    						cout<<endl;
    						closesocket(sClient);
    					}
    					cout<<"玩家1当前得分 —"<<win_1[0]<<"分"<<endl;
    					cout<<"玩家2当前得分 —"<<win_2[0]<<"分"<<endl;
    					cout<<"是否继续比赛(yes(YES) or no(NO))"<<endl;
    					cin>>flag;
    					if(flag=="no"||flag=="NO"){
    						if(win_1[0]==win_2[0]){
    							cout<<"玩家1和玩家2平局"<<endl; 
    						}else if(win_1[0]>win_2[0]){
    							cout<<"恭喜玩家1获胜"<<endl;
    						}else if(win_1[0]<win_2[0]){
    							cout<<"恭喜玩家2获胜"<<endl;
    						}
    						win_1[0]=0;
    						win_2[0]=0;
    						break;
    					}else if(flag=="yes"||flag=="YES"){
    						init_chess_layout();
                        	init_chess();
    						system("cls");
    						continue;
    					}
    				}
    			}else{
    				cout<<"匹配失败"<<endl;
    			}
    			cout<<"是否还要匹配其他玩家继续游戏!(YES(yes) or NO(no): ";
    			string come;
    			cin>>come;
    			if(come=="YES"||come=="yes"){
    				continue;
    			}else{
    				cout<<"结束游戏!"<<endl;
    				return 0;
    			}
    		}
    	}
    	closesocket(slisten);
    	WSACleanup();
    }
    int start(){
    	system("color F4");
    	string flag;
    	string begin="";
    	int overflow=0; 
    	string win="";
    	if(!Log()){
    		return 0;
    	}
    	/*管理员 
    	string manager_id="19103001";
        string manager_name="张文豪";
    	*/
    	Menu_2();
    	cout<<"玩家是否进入游戏: ";
    	cin>>begin;
    	init_chess_layout();
    	init_chess();
    	if(begin=="E"){
    		Help();
    		cout<<"请问您是需要帮助吗?(YES(yes) or NO(no)): ";
    		cin>>flag;
    			if(flag=="YES"||flag=="yes"){
    				cout<<"请输入您需要的内容: ";
    				string g;
    				cin>>g;
    				if(g=="G"){
    					G();
    				}else if(g=="CA"){
    					Code_Accounts();
    				}		
    			}	
    			while(true){
    				cout<<"玩家需要修改个人信息吗?(YES(yes) or NO(no)): ";
    				cin>>flag;
    				if(flag=="YES"||flag=="yes"){
    					cout<<"请玩家输入账号 密码和姓名(id/code/name): ";
    					int tt=0;
    					while(!tt){
    						string id;
    						string name;
    						string code_word;
    						cin>>id>>code_word>>name;
    						tt=Player_Update(id,code_word,name);
    					}	
    				}
    				cout<<"请输入棋盘的大小: ";
    	        	cin>>n; 
    				cout<<"           请玩家选择游戏模式           "<<endl;
    				Select();
    				cin>>Model;
    				string name;
    				if(Model=="P"){
    					cout<<"请玩家是否要查看其他的玩家?(YES(yes) or NO(no))"<<endl;
    					string q;
    					cin>>q;
    					if(q=="YES"||q=="yes"){
    						cout<<"-----------"<<endl;
    						query_name();
    						cout<<"-----------"<<endl;
    					}
    					Sever();
    				}else if(Model=="PC"){
    					int win_1=0;
    		        	int win_2=0;
    		        		while(true){
    		        			init_chess_layout();
                            	init_chess();
    		        			system("color F4");
    					    	overflow=0;	
    							while(true){
    								int x,y;
    								int tag=0;
    								if(!OverFlow())break;
    								while(true){
    									Display();
    									cout<<"玩家输入坐标: ";
    									cin>>x>>y;
    									if(check(x,y)){
    										Position(x,y,1);
    										tag=Judge_Win(x,y,1);
    										if(tag==1){
    											win_1++;
    										}
    								    	system("cls");
    								    	break;
    									}else{
    										system("cls");
    										cout<<"玩家输入的坐标不合法"<<endl; 
    									}
    								}	
    								if(tag==0){
    									Display();
    									int x = 0;
    							        int y = 0;
    							        if(!OverFlow()){
    							        	overflow=1;
    							        	break;
    									}
    									if(chess_num()<=rate[n-5]){
    										x,y=findposition();
    									}else{
    										while (1){                    //循环查找空位置
    								            x = (rand() % n) + 1;      //产生从1~N的随机数
    								            srand((unsigned int)time(NULL));
    								            y = (rand() % n) + 1;      //产生从1~N的随机数
    								            srand((unsigned int)time(NULL));
    								            if (check(x,y)){ //如果这个位置为空(没有棋子),跳出循环,下棋
    								                break;
    								            }
    								        }
    									} 
    									Position(x,y,2);
    									tag=Judge_Win(x,y,2);
    									if(tag==2){
    										win_2++;
    									}
    							    	system("cls");
    								}
    								if(tag==1||tag==2||overflow==1)break;	
    							}
    							Display();
    							cout<<"玩家当前得分 —"<<win_1<<"分"<<endl;
    							cout<<"PC-当前得分  —"<<win_2<<"分"<<endl;
    							cout<<"是否继续比赛(yes(YES) or no(NO))"<<endl;
    							cin>>flag;
    							if(flag=="no"||flag=="NO"){
    								if(win_1==win_2){
    									cout<<"玩家和PC平局"<<endl; 
    								}else if(win_1>win_2){
    									cout<<"恭喜玩家获胜"<<endl;
    								}else if(win_1<win_2){
    									cout<<"PC获胜"<<endl;
    								}
    								win_1=0;
    								win_2=0;
    								break;
    							}else if(flag=="YES"||flag=="yes"){
    								init_chess_layout();
                                	init_chess();
    								system("cls");
    								continue;
    							}
    					}
    				}
    			cout<<"请问您要退出游戏吗?(yes(YES) or NO(no): ";
    			string rt;
    			cin>>rt;
    			if(rt=="YES"||rt=="yes"){
    				break;
    			}
    			One_manager_operation();
    		}
        }
    }
    int main(){
    	start();
    	return 0;
    }
    
    

    客户端代码(Socket):

    #include<set>
    #include<map>
    #include<cmath>
    #include<ctime>
    #include<stack>
    #include<queue>
    #include<ctime>
    #include<vector>
    #include<cstdio>
    #include<cstdlib>
    #include<iomanip>
    #include<cstring>
    #include<fstream>
    #include<conio.h>
    #include<iomanip>
    #include<iostream>
    #include<algorithm>
    #include<WinSock2.h>
    using namespace std;
    #pragma comment(lib,"ws2_32.lib")
    const int maxx=105;
    char chess_1='#';//玩家1 
    char chess_2='@';//玩家2 或者PC 
    char chess_layout[maxx][maxx];
    char chess[maxx][maxx];
    int rate[28]={4,6,7,9,11,13,15,17,21,24,27,31,35,39,43,48,53,58,64,69,75,81,88,94,101,108,115,123};
    int n;
    string Model; 
    
    //菜单的选择 
    void Menu_1(){
    	system("color F4");
    	cout<<"***************************************"<<endl;
    	cout<<"*            A -添加玩家              *"<<endl;
    	cout<<"*            DBA-授权管理             *"<<endl;
    	cout<<"*            T-管理信息查询           *"<<endl; 
    	cout<<"*            D-删除玩家信息           *"<<endl; 
    	cout<<"*            U-修改玩家信息           *"<<endl; 
    	cout<<"****************************************"<<endl;
    }
    void Menu_2(){
    	system("color F4");
    	cout<<"***************************************"<<endl;
    	cout<<"*            E-进入游戏               *"<<endl;
    	cout<<"*            Q-退出游戏               *"<<endl;
    	cout<<"****************************************"<<endl;
    }
    //菜单的选择 
    void Select(){
    	system("color F4");
    	cout<<"***************************************"<<endl;
    	cout<<"*            PC-人机对弈              *"<<endl; 
    	cout<<"*            P -玩家对弈              *"<<endl;
    	cout<<"***************************************"<<endl;
    }
    //对棋盘初始化 
    void init_chess_layout(){
    	system("color F4");
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			chess_layout[i][j]=' ';
    		}
    	}
    }
    
    //判断玩家放置的棋子是否合法 
    int check(int x,int y){
    	system("color F4");
    	if(x>=1&&x<=n&&y>=1&&y<=n&&chess_layout[x][y]!='#'&&chess_layout[x][y]!='@'){
    		return 1;
    	}
    	return 0;
    }
    //棋子的放置位置 
    void Position(int x,int y,int flag){
    	system("color F0");
    	if(chess_layout[x][y]==' '){
    		if(flag==1){
    			system("color F");
    			chess[2*x][5*y+1]=chess_1;
    			chess_layout[x][y]=chess_1;
    		}else if(flag==2){
    			system("color F");
    			chess[2*x][5*y+1]=chess_2;
    			chess_layout[x][y]=chess_2;
    		}
    	}
    }
    //判断赢者 
    int Judge_Win(int x,int y,int flag){
    	system("color F0");
    	int win=0;
    	if(flag==1){
    		//行判断 
    		for(int i=1;i<=n;i++){
    			if(chess_layout[x][i]=='#'){
    				win++;
    			}else{
    				win=0;
    			}
    			if(win>=5)break;
    		}
    		if(win>=5){
    			return flag;
    		}
    		win=0;
    		//列判断 
    		for(int i=1;i<=n;i++){
    			if(chess_layout[i][y]=='#'){
    				win++;
    			}else{
    				win=0;
    			}
    			if(win>=5)break;
    		}
    		if(win>=5){
    			return flag;
    		}
    		//斜线判断
    		win=0;
    		//从这条斜线的起始位置判断 
    		//当斜率为正时 
    		int tx=x;
    		int ty=y;
    		while(tx>1&&ty>1){
    			tx--;
    			ty--;
    		} 
    		while(tx<=n&&ty<=n){
    			if(chess_layout[tx][ty]=='#'){
    				win++;
    			}else{
    				win=0;
    			}
    			tx++;
    			ty++;
    			if(win>=5)break;
    		}
    		if(win>=5){
    			return flag;
    		}
    		//当斜率为负时
    		win=0;
    		int rx=x;
    		int ry=y;
    		while(rx>1&&ry<n){
    			rx--;
    			ry++;
    		}
    		while(rx<=n&&ry>=1){
    			if(chess_layout[rx][ry]=='#'){
    				win++;
    			}else{
    				win=0;
    			}
    			rx++;
    			ry--;
    			if(win>=5)break;
    		}
    		if(win>=5){
    			return flag;
    		}
    	}else if(flag==2){
    			//行判断 
    		for(int i=1;i<=n;i++){
    			if(chess_layout[x][i]=='@'){
    				win++;
    			}else{
    				win=0;
    			}
    			if(win>=5)break;
    		}
    		if(win>=5){
    			return flag;
    		}
    		win=0;
    		//列判断 
    		for(int i=1;i<=n;i++){
    			if(chess_layout[i][y]=='@'){
    				win++;
    			}else{
    				win=0;
    			}
    			if(win>=5)break;
    		}
    		if(win>=5){
    			return flag;
    		}
    		//斜线判断
    		win=0;
    		//从这条斜线的起始位置判断 
    		//当斜率为正时 
    		int tx=x;
    		int ty=y;
    		while(tx>1&&ty>1){
    			tx--;
    			ty--;
    		} 
    		while(tx<=n&&ty<=n){
    			if(chess_layout[tx][ty]=='@'){
    				win++;
    			}else{
    				win=0;
    			}
    			tx++;
    			ty++;
    			if(win>=5)break;
    		}
    		if(win>=5){
    			return flag;
    		}
    		//当斜率为负时 
    		win=0;
    		int rx=x;
    		int ry=y;
    		while(rx>1&&ry<n){
    			rx--;
    			ry++;
    		}
    		while(rx<=n&&ry>=1){
    			if(chess_layout[rx][ry]=='#'){
    				win++;
    			}else{
    				win=0;
    			}
    			rx++;
    			ry--;
    			if(win>=5)break;
    		}
    		if(win>=5){
    			return flag;
    		}
    	}
    	return 0; 
    }
    //输出棋盘 
    void Display(){
    	system("color F0");
    	cout<<"    ";
    	for(int i=1;i<=n;i++){
    		cout<<i<<"    "; 
    	}
    	cout<<endl;
    	for(int j=1;j<=n+1;j++){
    		cout<<"   |";
    		for(int i=1;i<=n;i++){
    			cout<<"----|";
    		}
    		if(j==n+1)break;
    		cout<<endl;
    		if((int)log10(j)==1){
    			cout<<j<<" |";
    		}else{
    			cout<<j<<"  |";
    		}
    		for(int i=1;i<=n;i++){
    			if(chess_layout[j][i]=='#'){
    				cout<<" "<<"●"<<" |";
    			}else if(chess_layout[j][i]=='@'){
    				cout<<" "<<"■"<<" |";
    			}else{
    				cout<<"  "<<" "<<" |";
    			}
    		}
    		cout<<endl;
    	}
    	cout<<endl;	
    }
    void Switch_Display_2(){
    	system("color F4");
    	for(int i=0;i<4;i++){
    		chess[0][i]=' ';
    	}
    	int index=4;
    	for(int i=1;i<=n;i++){
    		if(i>=10){
    			chess[0][index]=(char)(i/10+48);
    			chess[0][index+1]=(char)(i%10+48);
    			index++;
    		}else{
    			chess[0][index]=(char)(i+48);
    		}
    		for(int j=index+1;j<=index+4;j++){
    			chess[0][j]=' ';
    		}
    		index=index+5;
    	}
    	cout<<endl;
    	for(int j=1;j<=2*n+1;j++){
    		int indexs=0;
    		for(int i=indexs;i<indexs+3;i++){
    			chess[j][i]=' ';
    		}
    		chess[j][indexs+3]='|';
    		indexs+=4;
    		for(int k=1;k<=n;k++){
    			for(int i=indexs;i<=indexs+3;i++){
    				chess[j][i]='-';
    			}
    			chess[j][indexs+4]='|';
    			indexs+=5;
    		}
    		if(j==2*n+1)break;
    		indexs=0;
    		j++; 
    		if((int)log10(j/2)==1){
    			if(j>=20){
    				chess[j][indexs]=(char)(j/10/2+48);
    				chess[j][indexs+1]=(char)(j/2%10+48);
    				chess[j][indexs+2]=' ';
    		    	chess[j][indexs+3]='|';
    		    	indexs+=4;
    			}else{
    				chess[j][indexs]=(char)(j/2+48);
    				chess[j][indexs+1]=' ';
    				chess[j][indexs+2]=' ';
    		    	chess[j][indexs+2]='|';
    		    	indexs+=3;
    			}
    		}else{
    			if(j>=20){
    				chess[j][indexs]=(char)(j/10/2+48);
    				chess[j][indexs+1]=(char)(j/2%10+48);
    				chess[j][indexs+2]=' ';
    				chess[j][indexs+3]=' ';
    				chess[j][indexs+4]='|';
    				indexs+=5;
    			}else{
    				chess[j][indexs]=(char)(j/2+48);
    				chess[j][indexs+1]=' ';
    				chess[j][indexs+2]=' ';
    				chess[j][indexs+3]='|';
    				indexs+=4;
    			}
    		}
    		for(int i=1;i<=n;i++){
    			chess[j][indexs+1]=' ';
    			chess[j][indexs+2]=' ';
    			chess[j][indexs+3]=' ';
    			chess[j][indexs+4]='|';
    			indexs+=5;
    		}
    	}
    }
    void init_chess(){
    	system("color F4");
    	for(int i=0;i<=2*n+2;i++){
    		for(int j=0;j<=6*n+2;j++){
    			chess[i][j]=' ';
    		}
    	}
    	Switch_Display_2();
    }
    void show(){
    	system("color F0");
    	for(int i=0;i<2*n+2;i++){
    		for(int j=0;j<6*n+2;j++){
    			if(chess_layout[i][j]=='#'){
    				cout<<"●";
    			}else if(chess_layout[i][j]=='@'){
    				cout<<"■";
    			}else{
    				cout<<chess_layout[i][j];
    			}
    		}
    		cout<<endl;
    	}
    }
    //判断棋盘是否放满 
    int OverFlow(){
    	system("color F0");
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			if(chess[2*i][5*j+1]==' '){
    				return 1;
    			}
    		}
    	}
    	return 0;
    }
    //查找整个棋盘可以放置棋子的个数 
    int chess_num(){
    	system("color F0");
    	int num=0;
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			if(chess_layout[i][j]==' '){
    				num++;
    			}
    		}
    	}
    	return num;
    }
    //查找为空的位置 
    int findposition(){
    	system("color F0");
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			if(chess_layout[i][j]==' '){
    				return i,j;
    			}
    		}
    	}
    }
    //游戏的开始 
    	/*
        0 = 黑色       8 = 灰色
        1 = 蓝色       9 = 淡蓝色
        2 = 绿色       A = 淡绿色
        3 = 浅绿色     B = 淡浅绿色
        4 = 红色       C = 淡红色
        5 = 紫色       D = 淡紫色
        6 = 黄色       E = 淡黄色
        7 = 白色       F = 亮白色
        */
    string manager_id="19103001";
    string manager_name="张文豪";
    struct DBA{
    	int vis_id;
    	string ID;
    	string name;
    	string code_word; 
    	DBA(){
    		vis_id=0;
    	}
    }dba[maxx];
    fstream fin;
    fstream fout;
    int man_num=0;//玩家数量 
    map<string ,string>mp;
    set<string>st; 
    //添加玩家 
    void ADD_player(string id,string code_word,string name){
    	system("color F1");
    	if(st.find(id)!=st.end()){
    		cout<<"该用户已经存在!请重新输入!"<<endl;
    		return ;
    	}
    	mp[name]=id;
    	st.insert(id);
    	dba[++man_num].ID=id;
    	dba[man_num].name=name;
    	dba[man_num].code_word=code_word;
    	fout.open("D:\\HUBEIUN.txt",ios_base::app);
    	fout<<0<<" "<<id<<" "<<code_word<<" "<<" "<<name<<endl;
    	fout.close();
    	cout<<"添加玩家成功!"<<endl;
    }
    /*
    19103001 
    张文豪
    */
    //超级管理员给二级管理员授权 
    void Empower(string id,string code_word,string name){
    	system("color F1");
    	int flag=0;
    	for(int i=1;i<=man_num;i++){
    		if(dba[i].ID==id&&dba[i].name==name&&dba[i].code_word==code_word){
    			dba[i].vis_id=1;
    			flag=1;
    			break;
    		}
    	}
    	if(flag==0){
    		cout<<"授权失败!请重新输入"<<endl;
    		return ;
    	}
    	fstream fin_s;
    	fstream fout_s;
    	fin.open("D:\\HUBEIUN.txt",ios_base::in);
    	fout_s.open("D:\\HU.txt",ios_base::out);
    	string str;
    	string index="";
    	string id_1="";
    	string name_1="";
    	str=index.append("1").append(" ").append(id).append(" ").append(code_word).append(" ").append(name);
    	string estr="";
    	char tt[maxx];
    	while(fin.getline(tt,100)){
    		estr="";
    		for(int i=0;i<strlen(tt);i++){
    			estr+=tt[i];
    		}
    		id_1="";
    		for(int i=2;i<10;i++){
    			id_1+=estr[i];
    		}
    		cout<<id_1<<endl;
    		if(id_1==id){
    			fout_s<<str<<endl;
    		}else{
    			fout_s<<estr<<endl;
    		}
    	}
    	fin.close();
    	fout_s.close();
    	string Data;
    	fin_s.open("D:\\HU.txt",ios_base::in);
    	fout.open("D:\\HUBEIUN.txt",ios_base::out);
    	char et[maxx];
    	while(fin_s.getline(et,100)){
    		Data="";
    		for(int i=0;i<strlen(et);i++){
    			Data+=et[i];
    		}
    		fout<<Data<<endl;
    	}
    	cout<<"授权成功!"<<endl;
    	fin_s.close();
    	fout.close();
    }
    //管理员查询玩家的信息
    void Query_player(){
    	system("color F1");
    	cout<<"----------------------------------------------------------------"<<endl;
    	cout<<"是否为二级管理员  | 玩家账号     |     玩家密码    |    玩家姓名"<<endl; 
    	cout<<"----------------------------------------------------------------"<<endl;
    	map<string,string>::iterator it;
    	for(int i=1;i<=man_num;i++){
        	cout<<"      "<<dba[i].vis_id<<"           |"<<" "<<dba[i].ID<<"     |       "<<dba[i].code_word<<"    |    "<<dba[i].name<<endl;
    	} 
    	cout<<"----------------------------------------------------------------"<<endl;
    } 
    //查询指定的玩家信息
    int Find_player(string id,string code_word){
    	system("color F1");
    	for(int i=1;i<=man_num;i++){
    		if(dba[i].ID==id&&dba[i].code_word==code_word){
    			return i;
    		}
    	}
    	return 0;
    } 
    //修改
    void Update(int index,string id,string code_word,string name){
    	system("color F1");
    	fstream fin_s;
    	fstream fout_s;
    	fin.open("D:\\HUBEIUN.txt",ios_base::in);
    	fout_s.open("D:\\HU.txt",ios_base::out);
    	string str;
    	string index_str="";
    	string indexs="";
    	string indext="";
    	if(dba[index].vis_id==1){
    		str=indexs.append("1").append(" ").append(dba[index].ID).append(" ").append(dba[index].code_word).append(" ").append(dba[index].name);
    		index_str=indext.append("1").append(" ").append(id).append(" ").append(code_word).append(" ").append(name);
    	}else{
    		str=indexs.append("0").append(" ").append(dba[index].ID).append(" ").append(dba[index].code_word).append(" ").append(dba[index].name);
    		index_str=indext.append("0").append(" ").append(id).append(" ").append(code_word).append(" ").append(name);
    	}
    	string estr="";
    	string stdc="";
    	char tt[maxx];
    	while(fin.getline(tt,100)){
    		estr="";
    		for(int i=0;i<strlen(tt);i++){
    			estr+=tt[i];
    		}
    		stdc="";
    		for(int i=0;i<estr.length();i++){
    			stdc+=estr[i];
    		}
    		if(stdc==str){
    			fout_s<<index_str<<endl;
    		}else{
    			fout_s<<estr<<endl;
    		}
    	}
    	fin.close();
    	fout_s.close();
    	string Data;
    	fin_s.open("D:\\HU.txt",ios_base::in);
    	fout.open("D:\\HUBEIUN.txt",ios_base::out);
    	char ty[maxx];
    	while(fin_s.getline(ty,100)){
    		Data="";
    		for(int i=0;i<strlen(ty);i++){
    			Data+=ty[i];
    		}
    		fout<<Data<<endl;
    	}
    	fin_s.close();
    	fout.close();
    } 
    //玩家修改信息
    int Player_Update(string id,string code_word,string name){
    	system("color F1");
    	int index;
    	int flag=0; 
    	for(int i=1;i<=man_num;i++){
    		if(dba[i].ID==id&&dba[i].code_word==code_word&&dba[i].name==name){
    			index=i;
    			flag=1;
    		}
    	}
    	if(flag==1){
    		cout<<"请玩家输入新的密码和姓名(code/name): ";
    		string code_word_1;
    		string name_1;
    		cin>>code_word_1>>name_1;
    		Update(index,id,code_word_1,name_1);
    		cout<<"玩家修改个人信息成功!"<<endl;
    		return 1;
    	}else{
    		cout<<"密码或者账户错误! 请玩家重新输入个人账号 密码和姓名!"<<endl;
    		return 0;
    	} 
    } 
    //首选需要输入超级管理员的身份,查看当前二级管理员(或普通玩家)并作修改 
    void Manager(){
    	system("color F1");
    	string id_1;
    	string name_1;
    	string code_word="";
    	string flag_1;
        string flag_2; 
    	cout<<"请问您需要查看当前二级管理员的信息吗?(YES(yes) or NO(no)): ";
    	cin>>flag_1;
    	if(flag_1 == "YES"||flag_1=="yes"){
    		cout<<"------------------------------"<<endl;
    		cout<<"二级玩家账号   |   玩家姓名   "<<endl;
    		cout<<"------------------------------"<<endl;
    		for(int i=1;i<=man_num;i++){
    			if(dba[i].vis_id==1){
    				cout<<dba[i].ID<<"       |      "<<dba[i].name<<endl;
    			}
    		} 
    		cout<<"------------------------------"<<endl;
    	}
    	cout<<"请问您需要查看当前普通玩家的信息吗?(YES(yes) or NO(no)): ";
    	cin>>flag_2; 
    	if(flag_2 == "YES"||flag_2=="yes"){
    		Query_player();
    	}
    	cout<<"请问您需要修改玩家信息吗?(yes(YES) or no(NO))"<<endl;
    	string flag;
    	cin>>flag;
    	if(flag=="no"||flag=="NO"){
    		return ;
    	}else{
    		cout<<"请输入需要修改的玩家账号(id): ";
    		cin>>id_1;
    		map<string,string>::iterator it;
    		for(int i=1;i<=man_num;i++){
    			if(dba[i].ID==id_1){
    				cout<<"请输入修改之后的玩家姓名和密码(code/name): ";
    				cin>>code_word>>name_1;
    				cout<<"请问您确定要修改玩家的信息吗?(YES(yes) or NO(no))"<<endl;
    				string rt;
    				cin>>rt;
    				if(rt=="YES"||rt=="yes"){
    					for(it=mp.begin();it!=mp.end();it++){
    						if(it->second==id_1){
    							mp.erase(it);
    							mp[name_1]=it->second;
    							Update(i,id_1,code_word,name_1);
    							dba[i].code_word=code_word;
    							dba[i].name=name_1;
    							cout<<"修改玩家信息成功!"<<endl;
    							break;
    						}
    					}
    					return ;
    				}else{
    					return ;
    				}	
    			}
    		} 
    	}
    }
    //请求帮助
    void G(){
    	system("color F2");
    	cout<<"*****************************************************************"<<endl;
    	cout<<"| 同一种棋子必须在同一行或同一列或同一斜线的数等于5(包括大于5),|"<<endl;
    	cout<<"| 先达到的一方获胜.                                             |"<<endl;
    	cout<<"*****************************************************************"<<endl;
    }
    void Code_Accounts(){
    	system("color F2");
    	cout<<"******************************************************************"<<endl;
    	cout<<"|          账户的位数必须是8位的数字或者大小字母混合.            |"<<endl;
    	cout<<"|          密码的位数必须是6位的数字或者大小字母混合.            |"<<endl;
    	cout<<"******************************************************************"<<endl;
    }
    void Help(){
    	system("color F2");
    	cout<<"以下是可能您要找的内容"<<endl; 
    	cout<<"---------------------------------------------"<<endl;
    	cout<<"                G-游戏规则                   "<<endl;
    	cout<<"                CA-账号8位                   "<<endl;
    	cout<<"---------------------------------------------"<<endl;
    } 
    //选择要对弈的玩家 ,如果匹配成功,则返回1,否则返回0 
    int Match_player(string name){
    	system("color F1");
    	for(int i=1;i<=man_num;i++){
    		if(dba[i].name==name){
    			cout<<"匹配成功!开始游戏!"<<endl;
    			return 1;
    		}
    	}
    	return 0;
    }
    //判断是不是一级管理员 
    int One_Manager(string id,string code_word,string name){
    	system("color F1");
    	if(id==manager_id&&name==manager_name&&code_word=="123456"){
    		return 1;
    	}
    	return 0;
    }
    //判断是不是二级管理员  
    int Judge_second_manager(string id,string code_word,string name){
    	system("color F1");
    	for(int i=1;i<=man_num;i++){
    		if((dba[i].ID==id&&dba[i].name==name&&dba[i].code_word==code_word)){
    			return 1;
    		}
    	}
    	return 0;
    }
    //查询玩家姓名
    void query_name(){
    	system("color F1");
    	map<string,string>::iterator it;
    	it=mp.begin();it++;
    	for(;it!=mp.end();it++){
    		cout<<it->first<<endl;
    	}
    } 
    //超级管理员对玩家的信息进行删除
    void Delete_player(string id,string code_word,string name){
    	system("color F1");
    	map<string,string>::iterator it;
    	it=mp.begin();it++;
    	for(;it!=mp.end();it++){
    		if(it->second==id){
    			mp.erase(it);
    			break;
    		}
    	}
    	int index=1;
    	for(int i=1;i<=man_num;i++){
    		if(dba[i].ID==id){
    			index=i;
    			break;
    		}
    	}
    	for(int i=index;i<man_num;i++){
    		dba[i]=dba[i+1];
    	}
    	fstream fin_s;
    	fstream fout_s;
    	fin.open("D:\\HUBEIUN.txt",ios_base::in);
    	fout_s.open("D:\\HU.txt",ios_base::out);
    	string str;
    	string indexs="";
    	string id_1="";
    	string name_1="";
    	if(dba[index].vis_id==1){
    		str=indexs.append("1").append(" ").append(id).append(" ").append(code_word).append(" ").append(name);
    	}else{
    		str=indexs.append("0").append(" ").append(id).append(" ").append(code_word).append(" ").append(name);
    	}
    	string estr="";
    	char tt[maxx];
    	while(fin.getline(tt,100)){
    		for(int i=0;i<strlen(tt);i++){
    			estr+=tt[i];
    		}
    		if(!estr.compare(str)){
    			continue;
    		}
    		fout_s<<estr<<endl;
    	}
    	fin.close();
    	fout_s.close();
    	string Data;
    	fin_s.open("D:\\HU.txt",ios_base::in);
    	fout.open("D:\\HUBEIUN.txt",ios_base::out);
    	char ty[maxx];
    	while(fin_s.getline(ty,100)){
    		Data="";
    		for(int i=0;i<strlen(ty);i++){
    			Data+=ty[i];
    		}
    		fout<<Data<<endl;
    	}
    	fin_s.close();
    	fout.close();
    	cout<<"删除成功!"<<endl;
    }
    //将文件中的数据存储到数组中
    void Switch(){
    	system("color F2");
    	char data[100];
    	string id="";
    	string name="";
    	string vis="";
    	string code_word="";
    	fin.open("D:\\HUBEIUN.txt",ios_base::in);
    	while(!fin.eof()){
    		fin.getline(data,100);
    		id="";
    		name="";
    		code_word="";
    		for(int i=2;i<10;i++){
    			if(data[i]!=' '){
    				id+=data[i];
    			}
    		}
    		for(int i=11;i<=16;i++){
    			code_word+=data[i];
    		} 
    		for(int i=17;i<strlen(data);i++){
    			if(data[i]!=' '){
    				name+=data[i];
    			}
    		}
    		dba[++man_num].ID=id;
    		dba[man_num].name=name;
    		dba[man_num].code_word=code_word;
    		if(data[0]=='1'){
    			dba[man_num].vis_id=1;
    		}else{
    			dba[man_num].vis_id=0;
    		}
    		mp[name]=id;
    		st.insert(id);
    	}
    	fin.close();
    } 
    //超级管理员拥有的权力 
    void Manager_1(){
    	system("color F1");
    	string flag;
    	string begin="";
    	int overflow=0; 
    	string win="";
    	string id_1;
    	string name_1;
    	string mag_id;
    	string mag_name;
    	string manager_1;
    	string manager_2;
    	cout<<"添加玩家: ";
    	string T1;
    	string code_word;
    	cin>>T1;
    	if(T1=="A"){
    		cout<<"请问您需要添加玩家吗?(YES(yes) or NO(no): ";
    		string sym;
    		cin>>sym;
    		int flags=0;
    		if(sym=="YES"||sym=="yes"){
    			while(true){
    				cout<<"请输入要添加的玩家账号 密码和姓名: ";
    				cin>>id_1>>code_word>>name_1;
    				ADD_player(id_1,code_word,name_1);
    				cout<<"请问您还需要添加玩家吗?(YES(yes) or NO(no): ";
    				string sym;
    				cin>>sym;
    				if(sym=="YES"||sym=="yes"){
    					continue;
    				}else{
    					break;
    				}
    			}
    		}
        }		
        /*
        19103001 张文豪 
        */
    	cout<<"授权管理: ";
    	string T2;
    	cin>>T2;
    	if(T2=="DBA"){
    		while(true){
    			string id_mag,name_mag;
    			string id_player,name_player;
    			cout<<"请输入要授权的玩家身份(id/code/name): ";
    			cin>>id_player;
    			cin>>code_word;
    			cin>>name_player; 
    			Empower(id_player,code_word,name_player);
    			cout<<"请问您要继续操作吗?(YES(yes) or NO(no)): ";
    			string flag_2;
    			cin>>flag_2;
    			if(flag_2=="YES"||flag_2=="yes"){
    				continue;
    			}else if(flag_2=="NO"||flag_2=="no"){
    				break;
    			}
    		}
    	} 
    	cout<<"修改玩家信息查询: ";
    	string T3;
    	cin>>T3;
    	if(T3=="U"){
    		while(true){
    			cout<<"是否进行管理信息查询(YES(yes) or NO(no): ";
    			string sym;
    			cin>>sym;
    			if(sym=="YES"||sym=="yes"){
    				Manager();
    			}else if(sym=="no"||sym=="NO"){
    				break;
    			}
    		}
    	}
    	map<string,string>::iterator it;
    	for(it=mp.begin();it!=mp.end();it++){
    		fout<<it->second<<" "<<it->first<<endl;
    	}
    	cout<<"管理信息查询: ";
    	string T6;
    	cin>>T6;
    	if(T6=="T"){
    		Query_player();
    	}
    	cout<<"删除玩家信息: ";
    	string T7;
    	cin>>T7;
    	if(T7=="D"){
    		cout<<"请输入玩家的身份(id/code/name): ";
    		string del_id;
    		string del_name;
    		while(true){
    			cin>>del_id>>code_word>>del_name;
    			Delete_player(del_id,code_word,del_name);
    			cout<<"是否继续操作?(YES(yes) or NO(no)): ";
    			string del;
    			cin>>del;
    			if(del=="YES"||del=="yes"){
    				continue;
    			}else{
    				break;
    			}
    		}
    	}
    }
    //二级管理员拥有的权力 
    void Manager_2(){
    	system("color F3");
    	cout<<"管理信息查询: ";
    	string T6;
    	cin>>T6;
    	if(T6=="T"){
    		while(true){
    			cout<<"请输入管理员信息: ";
    			string T_id;
            	string T_name;
    			cin>>T_id>>T_name;
    			Query_player();
    		}
    	}
    }
    void One_manager_operation(){
    	system("color F1");
    	Menu_1();
    	string id;
    	string name;
    	string code_word;
    	//  Judge_second_manager
    	cout<<"请问您需要选择身份吗?(超级管理员/二级管理员)(yes(YES) or NO(no)): ";
    	string tt;
    	cin>>tt;
    	if(tt=="no"||tt=="NO"){
    		return ;
    	}
    	while(true){
    		cout<<"请输入您的账号 密码和姓名: ";
    		cin>>id>>code_word>>name;
    		if(One_Manager(id,code_word,name)){
    			Manager_1(); 
    			cout<<endl;
    		}else if(Judge_second_manager(id,code_word,name)){
    			Manager_2(); 
    			cout<<endl;
    		}
    		cout<<"请问您还需要继续上述操作吗?(YES(yes) or NO(no)): ";
    		string log;
    		cin>>log;
    		if(log=="YES"||log=="yes"){
    			continue;
    		}else{
    			break;
    		}
    	} 
    }
    int Log(){
    	system("color F2");
    	string id_1;
    	string name_1;
    	Switch();
    	int Log_flag=0;
    	int Log_cnt=0;
    	string code_word="";
    	cout<<"                  登录                "<<endl;
    	while(true){
    		cout<<"账号: ";
    		cin>>id_1;
    		cout<<"密码: ";
    		cin>>code_word;
    		cout<<"姓名: ";
    		cin>>name_1;
    		Log_cnt++;
    		int flag=0;
    		for(int i=1;i<=man_num;i++){
    			if(dba[i].ID==id_1&&dba[i].code_word==code_word&&dba[i].name==name_1){
    				flag=1;
    				break;
    			}
    		}
    		if(flag==0){
    			if(Log_cnt==3){
    				cout<<"抱歉,您已输入过三次,您将没有机会输入!"<<endl;
    				Log_flag=1;
    				break;
    			}
    			cout<<"您输入的账号或者姓名错误!"<<endl;
    			cout<<"您还有"<<3-Log_cnt<<"次登录机会,"<<"请重新输入您的账号和姓名!"<<endl;
    			continue;
    		}else{
    			cout<<"登录成功!"<<endl;
    			break;
    		}
    	}
    	cout<<endl;
    	if(Log_flag==0){
    		One_manager_operation();
    	}else{
    		cout<<"您不能再登录此系统!"<<endl;
    		return 0;
    	}
    		
    }
    int Socket(){
    	system("color F1");
    	string name;
    	string flag;
    	WORD sockVersion = MAKEWORD(2, 2);
    	WSADATA data;
    	if (WSAStartup(sockVersion, &data) != 0) {
    		return 0;
    	}
    	SOCKET sclient;
    	while (true) {
    		
    		//构造通讯SOCKET 流式SOCKET 
    		sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    		if (sclient == INVALID_SOCKET) {
    			cout << "invlaid socket!" << endl;
    			return 0;
    		}
    		//配置要连接的IP和端口
    		sockaddr_in serAddr;
    		serAddr.sin_family = AF_INET;
    		serAddr.sin_port = htons(4443);
    		serAddr.sin_addr.S_un.S_addr = inet_addr("192.168.43.134");
    		//连接失败 
    		if (connect(sclient, (sockaddr*)&serAddr, sizeof(serAddr)) == SOCKET_ERROR) {
    			cout << "connect error!" << endl;
    			closesocket(sclient);
    			return 0;
    		}	
    		
    		int vis=0;
    		while(true){
    			cout<<"请输入要匹配的玩家姓名: ";
    	    	cin>>name;
    	    	init_chess_layout();
    	    	init_chess();
    			if(Match_player(name)){
    				int win_1[5];
    	        	int win_2[5];
    	        	memset(win_1,0,sizeof(win_1));
    	        	memset(win_2,0,sizeof(win_2));
    				while(true){
    					int win=0;
    					while(true){
    						system("color 0F");
    						//构造通讯SOCKET 流式SOCKET 
    						sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    						if (sclient == INVALID_SOCKET) {
    							cout << "invlaid socket!" << endl;
    							return 0;
    						}
    						//配置要连接的IP和端口
    						sockaddr_in serAddr;
    						serAddr.sin_family = AF_INET;
    						serAddr.sin_port = htons(4443);
    						serAddr.sin_addr.S_un.S_addr = inet_addr("192.168.43.134");
    						//连接失败 
    						if (connect(sclient, (sockaddr*)&serAddr, sizeof(serAddr)) == SOCKET_ERROR) {
    							cout << "connect error!" << endl;
    							closesocket(sclient);
    							return 0;
    						}	
    						int x,y;
    						int tag[maxx];
    						memset(tag,0,sizeof(tag));
    						if(!OverFlow())break;
    						while(true){
    							Display();
    							int x,y;
    							cout<<"玩家1输入坐标: ";
    							cin>>x>>y;
    							if(check(x,y)){
    								Position(x,y,1);
    								tag[0]=Judge_Win(x,y,1);
    								if(tag[0]==1){
    									win_1[0]++;
    								}else if(tag[0]==2){
    									win_2[0]++;
    								}
    						    	system("cls");
    						    	break;
    							}else{
    								system("cls");
    								cout<<"玩家1输入的坐标不合法"<<endl; 
    							}
    							
    						}
    						char sendData[2550];
    						memset(sendData,0,sizeof(sendData));
    						Display();
    						int k=0;
    						for(int i=0;i<2*n+2;i++){
    							for(int j=0;j<6*n+2;j++){
    								if(chess[i][j]!='\0'){
    									sendData[k++]=chess[i][j];
    								}else{
    									sendData[k++]=' ';
    								}
    							}
    							sendData[k++]='P';
    						}
    						
    						send(sclient, sendData,strlen(sendData), 0);
    						if(tag[0]==1||tag[0]==2){
    							break;
    						}
    						cout<<"等待玩家2输入..."<<endl;
    						char revData[1024];
    						memset(revData,0,sizeof(revData));
    						int ret = recv(sclient, revData, 2550, 0);
    						
    						if(ret!=0){
    							for(int i=0;i<strlen(revData)-2;i++){
    								if(revData[i]=='P'){
    									cout<<endl;
    								}else{
    									cout<<revData[i];
    								}
    							}
    						}
    						
    						
    						int i=0,j=0;
    						for(int k=0;k<strlen(revData);k++){
    							if(revData[k]=='P'){
    								i++;
    								j=0;
    							}else{
    								chess[i][j]=revData[k];
    								j++;
    							}
    						}
    						
    						for(int i=1;i<=n;i++){
    							for(int j=1;j<=n;j++){
    								if(chess[2*i][5*j+1]=='#'||chess[2*i][5*j+1]=='@'){
    									chess_layout[i][j]=chess[2*i][5*j+1];
    								}else{
    									chess_layout[i][j]=' ';
    								}
    							}
    						}
    						
    						cout<<endl;
    						
    					}
    					cout<<endl;
    					cout<<"玩家1当前得分 —"<<win_1[0]<<"分"<<endl;
    					cout<<"玩家2当前得分 —"<<win_2[0]<<"分"<<endl;
    					cout<<"是否继续比赛(yes(YES) or no(NO))"<<endl;
    					cin>>flag;
    					if(flag=="no"||flag=="NO"){
    						if(win_1[0]==win_2[0]){
    							cout<<"玩家1和玩家2平局"<<endl; 
    						}else if(win_1[0]>win_2[0]){
    							cout<<"恭喜玩家1获胜"<<endl;
    						}else if(win_1[0]<win_2[0]){
    							cout<<"恭喜玩家2获胜"<<endl;
    						}
    						win_1[0]=0;
    						win_2[0]=0;
    						break;
    					}else if(flag=="yes"||flag=="YES"){
    						init_chess_layout();
    						init_chess();
    						system("cls");
    						continue;
    					}
    				}
    			}else{
    				cout<<"匹配失败"<<endl;
    			}
    			cout<<"是否还要匹配其他玩家继续游戏!(YES(yes) or NO(no): ";
    			string come;
    			cin>>come;
    			if(come=="YES"||come=="yes"){
    				continue;
    			}else{
    				cout<<"结束游戏!"<<endl;
    				return 0;
    			}
    		}
    	}
    	closesocket(sclient);
    	WSACleanup();
    }
    int start(){
    	system("color F4");
    	string flag;
    	string begin="";
    	int overflow=0; 
    	string win="";
    	if(!Log()){
    		return 0;
    	}
    	/*管理员 
    	string manager_id="19103001";
        string manager_name="张文豪";
    	*/
    	Menu_2();
    	cout<<"玩家是否进入游戏: ";
    	cin>>begin;
    	init_chess_layout();
    	init_chess();
    	if(begin=="E"){
    		Help();
    		cout<<"请问您是需要帮助吗?(YES(yes) or NO(no)): ";
    		cin>>flag;
    			if(flag=="YES"||flag=="yes"){
    				cout<<"请输入您需要的内容: ";
    				string g;
    				cin>>g;
    				if(g=="G"){
    					G();
    				}else if(g=="CA"){
    					Code_Accounts();
    				}		
    			}	
    			while(true){
    				cout<<"玩家需要修改个人信息吗?(YES(yes) or NO(no)): ";
    				cin>>flag;
    				if(flag=="YES"||flag=="yes"){
    					cout<<"请玩家输入账号 密码和姓名(id/code/name): ";
    					int tt=0;
    					while(!tt){
    						string id;
    						string name;
    						string code_word;
    						cin>>id>>code_word>>name;
    						tt=Player_Update(id,code_word,name);
    					}	
    				}
    				cout<<"请输入棋盘的大小: ";
    	        	cin>>n; 
    				cout<<"           请玩家选择游戏模式           "<<endl;
    				Select();
    				cin>>Model;
    				string name;
    				if(Model=="P"){
    					cout<<"请玩家是否要查看其他的玩家?(YES(yes) or NO(no))"<<endl;
    					string q;
    					cin>>q;
    					if(q=="YES"||q=="yes"){
    						cout<<"-----------"<<endl;
    						query_name();
    						cout<<"-----------"<<endl;
    					}
    			        Socket();
    				}else if(Model=="PC"){
    					int win_1=0;
    		        	int win_2=0;
    		        		while(true){
    		        			init_chess_layout();
    		        			init_chess();
    		        			system("color F4");
    					    	overflow=0;	
    							while(true){
    								int x,y;
    								int tag=0;
    								if(!OverFlow())break;
    								while(true){
    									Display();
    									cout<<"玩家输入坐标: ";
    									cin>>x>>y;
    									if(check(x,y)){
    										Position(x,y,1);
    										tag=Judge_Win(x,y,1);
    										if(tag==1){
    											win_1++;
    										}
    								    	system("cls");
    								    	break;
    									}else{
    										system("cls");
    										cout<<"玩家输入的坐标不合法"<<endl; 
    									}
    								}	
    								if(tag==0){
    									Display();
    									int x = 0;
    							        int y = 0;
    							        if(!OverFlow()){
    							        	overflow=1;
    							        	break;
    									}
    									if(chess_num()<=rate[n-5]){
    										x,y=findposition();
    									}else{
    										while (1){                    //循环查找空位置
    								            x = (rand() % n) + 1;      //产生从1~N的随机数
    								            srand((unsigned int)time(NULL));
    								            y = (rand() % n) + 1;      //产生从1~N的随机数
    								            srand((unsigned int)time(NULL));
    								            if (check(x,y)){ //如果这个位置为空(没有棋子),跳出循环,下棋
    								                break;
    								            }
    								        }
    									} 
    									Position(x,y,2);
    									tag=Judge_Win(x,y,2);
    									if(tag==2){
    										win_2++;
    									}
    							    	system("cls");
    								}
    								if(tag==1||tag==2||overflow==1)break;	
    							}
    							Display();
    							cout<<"玩家当前得分 —"<<win_1<<"分"<<endl;
    							cout<<"PC-当前得分  —"<<win_2<<"分"<<endl;
    							cout<<"是否继续比赛(yes(YES) or no(NO))"<<endl;
    							cin>>flag;
    							if(flag=="no"||flag=="NO"){
    								if(win_1==win_2){
    									cout<<"玩家和PC平局"<<endl; 
    								}else if(win_1>win_2){
    									cout<<"恭喜玩家获胜"<<endl;
    								}else if(win_1<win_2){
    									cout<<"PC获胜"<<endl;
    								}
    								win_1=0;
    								win_2=0;
    								break;
    							}else if(flag=="YES"||flag=="yes"){
    								init_chess_layout();
    								init_chess();
    								system("cls");
    								continue;
    							}
    					}
    				}
    			cout<<"请问您要退出游戏吗?(yes(YES) or NO(no): ";
    			string rt;
    			cin>>rt;
    			if(rt=="YES"||rt=="yes"){
    				break;
    			}
    			One_manager_operation();
    		}
        }
    }
    int main(){
    	start();
    	return 0;
    }
    
    

    首先是服务端运行其运行起来,以下是服务端首先运行的结果(Server):
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    客户端运行起来(Socket):
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    下面是服务端客户端进行下棋的结果:

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    如果有什么错误的地方请指出!谢谢!

    展开全文
  • C语言实现的Socket编程

    2021-05-20 10:19:01
    if ((sockfd = socket(AF_INET, SOCK_STREAM,0)) ) { printf("can’t create socket\n"); exit(1); } memset( &sin_addr, 0, sizeof(sin_addr)); sin_addr.sin_family = AF_INET; sin_addr.sin_addr.s_addr = htonl...

    接收端程序:

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #define myport 319

    char buf[200];

    int main(int argc , char *argv[])

    {

    int sockfd,new_sockfd;

    struct sockaddr_in sin_addr,pin_addr;

    int len, pin_addr_size,i;

    if ((sockfd = socket(AF_INET, SOCK_STREAM,0)) <0)

    {

    printf("can’t create socket\n");

    exit(1);

    }

    memset( &sin_addr, 0, sizeof(sin_addr));

    sin_addr.sin_family = AF_INET;

    sin_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    sin_addr.sin_port = htons(myport);

    if (bind(sockfd, (struct sockaddr *)&sin_addr, sizeof(sin_addr))<0)

    {

    printf("can’t bind socket\n");

    exit(1);

    }

    if (listen(sockfd, 5) < 0 )

    {

    printf("listen error\n");

    exit(1);

    }

    while (1)

    {

    if ((new_sockfd = accept (sockfd, (struct sockaddr *)&pin_addr,&pin_addr_size)) < 0)

    {

    printf("accept eroor\n");

    exit(1);

    }

    if(recv(new_sockfd, buf, 200, 0) == -1)

    {

    printf("can’t receive packet\n");

    exit(1);

    }

    printf("received from client:%s\n", buf);

    close(new_sockfd);

    }

    return 0;

    }

    发送端程序:

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #define myport 319

    char buf[200]="Hello World!";

    int main(int argc , char *argv[])

    {

    int sockfd,new_sockfd;

    struct sockaddr_in sin_addr,pin_addr;

    int len, pin_addr_size,i;

    if ((sockfd = socket(AF_INET, SOCK_STREAM,0)) <0)

    {

    printf("can’t create socket\n");

    exit(1);

    }

    memset( &sin_addr, 0, sizeof(sin_addr));

    sin_addr.sin_family = AF_INET;

    sin_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    sin_addr.sin_port = htons(myport);

    if((new_sockfd=connect(sockfd,(struct sockaddr *)&sin_addr, sizeof(sin_addr)))!=0)

    {

    printf("connect error!\n");

    exit(1);

    }

    while(1)

    {

    if(send(sockfd, buf, strlen(buf), 0)<=0)

    {

    printf("发送失败!\n");

    exit(1);

    }

    }

    close(new_sockfd);

    }

    此时“Hello World”只能发送一次到接收端,然后发送端终止。

    如果想让服务端一直接收“Hello World”,需要把accept放在While循环外面,close放在While循环外面。此时会刷屏。

    但是这样仍然有问题,此时接收端只能接收第一个建立TCP连接的发送端,即成为了点对点程序。如果想要和接收端建立多个TCP连接,就出现了问题。

    所以最好的方法是在接收端建立多线程:

    接收端:

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #define myport 6666

    void *thread_function(void *arg)

    {

    char buf[200];

    int new_sockfd = (int)arg;

    while(1)

    {

    bzero(buf,200);

    if(recv(new_sockfd, buf, 200, 0) == -1)

    {

    printf("can’t receive packet\n");

    break;//以前是Exit

    }

    printf("received from client:%s\n", buf);

    }

    close(new_sockfd);

    }

    int main(int argc , char *argv[])

    {

    int sockfd;

    struct sockaddr_in sin_addr;

    if ((sockfd = socket(AF_INET, SOCK_STREAM,0)) <0)

    {

    printf("can’t create socket\n");

    exit(1);

    }

    memset( &sin_addr, 0, sizeof(sin_addr));

    sin_addr.sin_family = AF_INET;

    sin_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    sin_addr.sin_port = htons(myport);

    if (bind(sockfd, (struct sockaddr *)&sin_addr, sizeof(sin_addr))<0)

    {

    printf("can’t bind socket\n");

    exit(1);

    }

    if (listen(sockfd, 5) < 0 )

    {

    printf("listen error\n");

    exit(1);

    }

    while(1)

    {

    struct sockaddr_in pin_addr;

    int pin_addr_size;

    int new_sockfd;

    if ((new_sockfd = accept (sockfd, (struct sockaddr *)&pin_addr,&pin_addr_size)) < 0)

    {

    printf("accept eroor\n");

    exit(1);

    }

    pthread_t a_thread;//开辟线程

    pthread_create(&a_thread,NULL,thread_function,(void *)new_sockfd);//创建进程

    }

    return 0;

    }

    发送端:

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #define myport 6666

    char buf[200];

    int main(int argc , char *argv[])

    {

    int sockfd,new_sockfd;

    struct sockaddr_in sin_addr,pin_addr;

    int len, pin_addr_size,i;

    if ((sockfd = socket(AF_INET, SOCK_STREAM,0)) <0)

    {

    printf("can’t create socket\n");

    exit(1);

    }

    memset( &sin_addr, 0, sizeof(sin_addr));

    sin_addr.sin_family = AF_INET;

    sin_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    sin_addr.sin_port = htons(myport);

    if((new_sockfd=connect(sockfd,(struct sockaddr *)&sin_addr, sizeof(sin_addr)))!=0)

    {

    printf("connect error!\n");

    exit(1);

    }

    while(1)

    {

    scanf("%s",buf);

    if(send(sockfd, buf, strlen(buf), 0)<=0)

    {

    printf("发送失败!\n");

    exit(1);

    }

    bzero(buf,200);

    }

    close(new_sockfd);

    }

    展开全文
  • PAGE 2计算机学院《计算机网络》实验报告实验名称 基于Socket 编程的FTP 客户端实现团队成员:姓 名班 级学 号贡献百分比得 分50%注:团队成员贡献百分比之和为1教师评语:目录TOC \o "1-3" \h \z \u一.环境 3二....

    PAGE 2

    计算机学院

    《计算机网络》实验报告

    实验名称 基于Socket 编程的FTP 客户端实现

    团队成员:

    姓 名

    班 级

    学 号

    贡献百分比

    得 分

    50%

    注:团队成员贡献百分比之和为1

    教师评语:

    目录

    TOC \o "1-3" \h \z \u

    一.环境 3

    二.实验目的 3

    三.实验内容及步骤(包括主要流程和说明) 3

    3.1实验内容 3

    3.2实验步骤 3

    3.3函数功能介绍 4

    四.实验结果 12

    五.实验感想 16

    环境

    本实验在win7系统上完成,使用Visual Studio 2012编程环境,完成了FTP客户端的编写。服务器端是下载了开源的免费开源的FTP客户端软件FileZilla Server Interface。由于在同一台计算机上实现,IP位本地IP:00。

    实验目的

    了解应用层和运输层的作用及相关协议的工作原理和机制。

    掌握 SOCKET 编程的基本方法。

    实验内容及步骤(包括主要流程和说明)

    实验内容

    编写一个FTP客户端,要求如下:

    1.能够指定FTP服务器的IP地址和端口号。

    2.能够按照主动(PORT)和被动(PASV)两种模式连接FTP服务器。

    3.支持匿名和用户名/口令二种身份验证。

    4.能实现目标FTP服务器目录上的目录切换/浏览。

    5.能够在上传和下载前指定源目录和上传目标目录。

    6.能够主动断开连接。

    7.可采用控制台或图形用户界面2种方式。

    8.提供下载上传进度指示和完成指示。

    9.具有目录浏览功能

    实验步骤

    FTP协议整个通信过程由多个步骤构成,从建立连接,文件传输到断开连接,这些不同的动作通过FTP的指令完成。FTP会话时包含了两个通道,一个叫控制通道,一个叫数据通道。控制通道是和FTP服务器进行沟通的通道,连接FTP,发送FTP指令都是通过控制通道来完成的,当客户端准备于服务器建立连接时,用户需要输入用户名以及密码来进行身份验证。当登陆成功后也就表示成功建立了控制通道的连接,端口号为21。而数据通道是和FTP服务器进行文件传输或者列表的通道。我们上传下载文件都是通过这个数据通道,每次使用都需重新建立连接。FTP协议中,控制连接均有客户端发起,而数据连接有两种工作图 SEQ 图 \* ARABIC 1

    图 SEQ 图 \* ARABIC 1 FTP工作流程图

    开始

    用户登陆,建立控制通道连接

    建立数据连接

    功能选择

    关闭数据连接

    结束

    根据实验要求,本实验需要具有上传与下载的功能,此外需要能够更新文件列表来实现文件的选择与更新,同时需要提供主动和被动两种方式实现上述功能模块。因此,本实验大体的功能模块如图2。

    图 SEQ 图 \* ARABIC

    图 SEQ 图 \* ARABIC 2 功能选择

    主动或被动连接

    文件上传

    文件下载

    关闭连接

    目录选择

    显示进度

    更新列表

    函数功能介绍

    OnConenct()

    该函数实现的是控制通路的连接以及用户的登陆功能,其中

    调用了自己设定的两个函数SockSend()和SockRecv()用来发送命令以及接收FTP服务器的答应并显示出来。通过调用特定函数获取IP地址和PORT号后,便使用socket的conection建立连接。

    在建立好控制连接后便进行用户登陆,可以选择匿名登陆或者用户名登陆。通过函数SockSend()和SockRecv()与服务器进行对话,发送的命令分别是USER和PASS,核心代码如下:

    Pasv()

    该函数实现了FTP的数据通路被动连接的功能,通过向服务器发现PASV的指令,服务器会返回一个端口号,通过这个端口号与服务器建立数据通路的连接,需注意返回的端口号要进行转换,部分代码如下:

    Port()

    该函数主要是实现数据通路主动连接的功能,调用SockSend()函数发送PORT命令,但是需要加上IP地址与端口号,之后调用socket的listen函数等待连接。代码如下:

    OnStorefile()

    该函数实现的文件上传的功能,此函数中调用了类CFileDialog的函数,发送STOR命令通知服务器上传文件,并用了socket的send的函数用来传送文件。部分代码如下:

    OnLoadfile()

    该函数主要实现文件下载的功能,实现形式大体上与文件上传类似,但发送的是RETR命令,采用的是recv函数来接收数据,部分代码如下。

    OnUpdate()

    该函数实现的是列表更新的功能,发送LIST指令,将服务器发送过来的数据显示出来,方便用户进行选择下载,代码如下:

    OnSelectMenu()

    对当前工作目录进行切换

    展开全文
  • 1、什么是Socket网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一...在Java环境下,Socket编程主要是指...

    1、什么是Socket

    网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。

    但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。

    cc2996dbb712d2551d89cc9178204470.png

    e62154b96c281381ab36673bceceb7c6.png

    2、Socket通讯的过程

    Server端Listen(监听)某个端口是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client 端都可以通过Send,Write等方法与对方通信。

    对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:

    (1) 创建Socket;

    (2) 打开连接到Socket的输入/出流;

    (3) 按照一定的协议对Socket进行读/写操作;

    (4) 关闭Socket。

    展开全文
  • import java.io.*; import java.net.*; import java.util.*; public class ReceiverAndSender { public static void main(String[] args) { try { // 创建DatagramPacket对象,用来准备接收数据 ...
  • 本文实例讲述了Java基于Tcp协议的socket编程方法,分享给大家供大家参考。具体分析如下:以下是一对一的通信编程实现,后续会继续学习一个服务器监听多个客户端的实现。这里用到的主要步骤如下:第一步:以特定端口...
  • 1、概念:什么是Socket和TCP Socket(套接字)使得应用程序通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一...(2)AF_INET基于网络类型,大部分网络编程使用AF_INET。 TCP(Transmission Control Protoco
  • 具体函数讲解太多,根据程序自行分析。 可以参考这篇文章: ... ... 一、socket 1.1 socket概述 socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用
  • 摘要基于Socket编程的基本原理和开发流程,本文设计并实现了基于单播和组播的多人聊天工具,以及基于组播的视频会议软件。本次Socket网络可视化编程的开发平台为Python + Qt。通过对两款软件的开发,深入理解了...
  • 基于TCP的Socket编程

    2021-06-21 21:54:37
    1.针对TCP该如何Socket编程 服务端和客户端初始化Socket,得到文件描述符 服务端调用bind,将绑定IP地址和端口 服务端调用listen,进行监听 服务端调用accept,等待客户端连接 客户端调用connect,向服务器端的...
  • Linux高性能server编程——信号及应用  信号 信号是由用户.系统或者进程发送给目标进程的信息.以通知目标进程某个状态的改变或系统异常. Linux信号可由例如以下条件产生: 对于前台进程.用户能够通过输入特殊的...
  • 学习初步练习基于c语言的socket编程

    千次阅读 2021-11-10 10:26:06
    引入套接字就不得不介绍一下**系统调用**和**应用编程接口**。 当我们有一些特定的应用需要互联网的支持,但这些应用又不能直接使用已经标准化的互联网协议,那么我们应当做哪些工作? 大多数操作使用**系统调用*...
  • 没有借助任何第三方库,完全基于JAVA Socket实现一个最小化的HTTP文件下载客户端。完整的演示如何通过Socket实现下载文件的HTTP请求(request header)发送如何从Socket中接受HTTP响应(Response header, Response body...
  • 1、DatagramPacket类的构造方法 2、DatagramSocket类的构造方法 3、DatagramSocket类常用方法 4、服务端packagecom.ljb.app.datagram;importjava.io.IOException;importjava.net.DatagramPacket;...
  • 《计算机网络socket编程实验报告》由会员分享,可在线阅读,更多相关《计算机网络socket编程实验报告(4页珍藏版)》请在人人文库网上搜索。1、实课程名称实验项目名称实验时间 (日期及节次)专业年级姓名验计算机科学...
  • 用python实现socket编程

    2021-08-23 10:02:39
    建立网络通信连接至少要一对端口号(socket),socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;...
  • socket编程实验心得体会

    千次阅读 2021-03-09 19:50:00
    } 四、实验心得体会 通过本次实验的练习,熟悉了TCP/IP协议,对套接字等概念有了深入的了解,对用Java语言实现Socket编程并实现客户端和服务器端的信息交互有了一定的了解。 JAVA编程心得 计算机3班 窦金霞 ...
  • 计算机网络实验socket编程实验三 socket套接字编程实验一、Sockets编程基础知识网络编程就是通过计算机网络与其他程序进行通信的程序,Socket编程是网络编程的主流工具。Socket API是实现进程间通信的一种编程设施,...
  • 1. 编程原理1.1服务器端(1) 创建ServerSocket对象,绑定监听端口;(2) 通过accept()方法监听客户端请求;(3) 连接建立后,通过输入流读取客户端发送的请求信息;(4) 通过输出流向客户端发送相应信息;(5) 关闭响应...
  • 基于TCP的socket编程实现client和server通信.实验内容:.client为单线程、server为多线程(群聊功能).原理:.套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和...
  • Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和...Socket编程一、网络基础知识(参考计算机网络)关于计算机网络部分可以参考相关博客:《TCP/IP协议栈及OSI参考模型详解》http://wangdy....
  • C语言实现Socket编程

    2021-05-22 01:04:18
    tcpsrv.c的内容如下: #include #include #define RECEIVE_MAX_LENGTH 100 #define SEND_MAX_LENGTH 100 void main() { WORD wVersionRequested;... } SOCKET socketClient = socket(AF_INET,SOCK_STREAM
  • 使用java如何实现基于TCP协议网络socket编程发布时间:2020-10-31 01:23:16来源:亿速云阅读:118作者:Leah使用java如何实现基于TCP协议网络socket编程?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望...
  • Socket 编程原理

    2021-03-30 15:27:51
    目录socket编程基本概念协议TCPUDPDNSICMPHTTPHTTPS编程流程socket函数 socket编程 基本概念 socket编程即计算机网络编程,目的是使两台主机能够进行远程连接,既然要使两者产生联系,那么就要有至少一个信息发送端...
  • 基于java的socket编程

    2021-06-02 21:24:30
    import java.io.IOException; import java.io.InputStream;...import java.net.Socket; // 服务端 public class Test { public static void main(String[] args) { byte []data = new byte[128]; int len = 0;
  • 服务端和客户端服务端运行流程(1)创建套接字(2)绑定IP和端口号(3)监听请求(4)接收客户端的请求(5)关闭套接字客户端运行流程(1)创建套接字(2)发送连接请求(3)关闭套接字二、导入模块import socket,threading三、...
  • Socket编程利用TCP协议的实验报告》由会员分享,可在线阅读,更多相关《Socket编程利用TCP协议的实验报告(8页珍藏版)》请在人人文库网上搜索。1、Socket 编程报告( TCP/IP 协议)实验目的通过 C+ 来实现 TCP/IP ...
  • Socket编程实验报告一、程序代码(1)服务器端#include #include #pragma comment(lib, "ws2_32.lib")void main(){ WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 1, 1 );err = ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 131,332
精华内容 52,532
关键字:

基于socket编程