国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C語(yǔ)言Socket編程TCP簡(jiǎn)單聊天室

這篇具有很好參考價(jià)值的文章主要介紹了C語(yǔ)言Socket編程TCP簡(jiǎn)單聊天室。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

C語(yǔ)言Socket編程TCP簡(jiǎn)單聊天室

簡(jiǎn)介

這是一個(gè)使用C語(yǔ)言進(jìn)行套接字編程實(shí)現(xiàn)的簡(jiǎn)單聊天室, 使用Pthread庫(kù)進(jìn)行多線程執(zhí)行

代碼

服務(wù)端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>  //Unix/Linux系統(tǒng)的基本系統(tǒng)數(shù)據(jù)類型的頭文件,含有size_t,time_t,pid_t等類型
#include <sys/socket.h> //套接字基本函數(shù)相關(guān)
#include <netinet/in.h> //IP地址和端口相關(guān)定義,比如struct sockaddr_in等
#include <arpa/inet.h>
#include <signal.h>
#include <errno.h>
#include <sys/wait.h>
#include <pthread.h>
#define MAX_MSG_SIZE 128
#define MAX_CLIENT_CONNECTION 128
#define MAX_FORWARD_MSG_SIZE (2 * MAX_MSG_SIZE + 32)
#define LOGIN 0
#define LOGOUT 1
int sigint_flag = 0;

typedef struct _client
{
    int clientfd;
    char nickname[MAX_MSG_SIZE];
    struct sockaddr_in clientsock;
    struct _client *next;
} Client;

pthread_mutex_t client_list_lock;

// 創(chuàng)建空白的節(jié)點(diǎn)
Client *createNode();
// 按照文件描述符刪除節(jié)點(diǎn)
int deleteNode(int targetfd);
// 將節(jié)點(diǎn)插入鏈表(頭部)
void insertNode(Client *newNode);
// 顯示鏈表中所有的節(jié)點(diǎn)
void displayAllClients();
// 全局廣播
void broadcast(const char *content);
// 獲取當(dāng)前時(shí)間字符串
char *getCurrentTime();
// 去除末尾的換行符
void trim_linefeed(char *str);
// 獲取登錄消息
char *getInfo(const char *nickname, int mode);

Client *head;

void *clientHandler(void *arg);

void sigpipe_handler(int signum, siginfo_t *info, void *context)
{
    printf("SIGPIPE detected!\n");
}

void sigint_handler(int signum, siginfo_t *info, void *context)
{
    printf("[svr] Server is shutting down...\n");
    sigint_flag = 1;
}

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

    struct sigaction sig_pipe, sig_int;
    sig_pipe.sa_flags = SA_SIGINFO;
    sig_pipe.sa_sigaction = sigpipe_handler;
    sigfillset(&sig_pipe.sa_mask);

    sig_int.sa_flags = SA_SIGINFO;
    sig_int.sa_sigaction = sigint_handler;
    sigfillset(&sig_int.sa_mask);

    // 為 SIGPIPE 和 SIGINT 設(shè)置信號(hào)處理函數(shù)
    if (sigaction(SIGPIPE, &sig_pipe, NULL) < 0)
    {
        perror("sigaction");
        return 1;
    }
    if (sigaction(SIGINT, &sig_int, NULL) < 0)
    {
        perror("sigaction");
        return 1;
    }

    // 處理命令行參數(shù)
    if (argc != 3)
    {
        printf("Usage: %s <ip_address> <port>\n", argv[0]);
        exit(1);
    }

    int port = atoi(argv[2]);
    int listenfd, connectfd;
    struct sockaddr_in server, client;
    int sin_size;

    if ((listenfd = socket(PF_INET, SOCK_STREAM, 0)) == -1)
    {
        perror("Create socket failed.");
        exit(-1);
    }

    int opt = SO_REUSEADDR;
    setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

    bzero(&server, sizeof(server));
    server.sin_family = AF_INET;
    server.sin_port = htons(atoi(argv[2]));
    inet_pton(AF_INET, argv[1], &server.sin_addr);

    if (bind(listenfd, (struct sockaddr *)&server, sizeof(server)) == -1)
    {
        perror("bind");
        exit(1);
    }

    if (listen(listenfd, MAX_CLIENT_CONNECTION) == -1)
    {
        perror("listen");
        exit(1);
    }

    // 初始化鏈表
    head = createNode();
    pthread_mutex_init(&client_list_lock, NULL);

    printf("[svr](%d)[svr_sa](%s:%d) Server has initialized!\n", getpid(), inet_ntoa(server.sin_addr), ntohs(server.sin_port));
    sin_size = sizeof(client);
    while (!sigint_flag)
    {

        if ((connectfd = accept(listenfd, (struct sockaddr *)&client, &sin_size)) < 0)
        {
            if (errno == EINTR)
            {
                continue;
            }
            perror("accept error");
            exit(1);
        }

        else
        {
            printf("[svr](%d)[cli_sa](%s:%d) Client is accepted!\n", getpid(), inet_ntoa(client.sin_addr), ntohs(client.sin_port));

            Client *newClient = createNode();
            newClient->clientfd = connectfd;
            newClient->clientsock = client;
            newClient->next = NULL;
            read(connectfd, newClient->nickname, MAX_MSG_SIZE);
            trim_linefeed(newClient->nickname);
            printf("[svr](%d)[cli_sa](%s:%d)[nickname](%s) User logged in!!\n", getpid(), inet_ntoa(client.sin_addr), ntohs(client.sin_port), newClient->nickname);
            char *info = getInfo(newClient->nickname, LOGIN);
            broadcast(info);
            free(info);
            insertNode(newClient);
            displayAllClients();

            pthread_t tid;
            if (pthread_create(&tid, NULL, clientHandler, newClient) != 0)
            {
                perror("pthread_create");
                exit(EXIT_FAILURE);
            }
            pthread_detach(tid);
        }
    }
    pthread_mutex_destroy(&client_list_lock);
    close(listenfd);
    return 0;
}

void *clientHandler(void *arg)
{
    Client *cli = (Client *)arg;

    pthread_t self = pthread_self();
    printf("[chd](%ld) Child thread is created!\n", self);
    int size;
    char buffer[MAX_MSG_SIZE + 2];
    char forward_buffer[MAX_FORWARD_MSG_SIZE];
    while (!sigint_flag)
    {
        bzero(buffer, sizeof(buffer));
        if ((size = read(cli->clientfd, buffer, MAX_MSG_SIZE + 2)) < 0)
        {
            if (errno == EINTR)
            {
                continue;
            }
            perror("read");
            exit(1);
        }
        else if (size == 0)
        {
            printf("[chd](%ld)[cli_sa](%s:%d)[nickname](%s) Client is closed!\n", self, inet_ntoa(cli->clientsock.sin_addr), ntohs(cli->clientsock.sin_port), cli->nickname);
            break;
        }
        else
        {
            bzero(forward_buffer, sizeof(forward_buffer));
            char *currentTime = getCurrentTime();
            snprintf(forward_buffer, MAX_FORWARD_MSG_SIZE - 1, "%s\n[%s]: %s", currentTime, cli->nickname, buffer);
            printf("[chd](%ld)[cli_sa](%s:%d)\n%s", self, inet_ntoa(cli->clientsock.sin_addr), ntohs(cli->clientsock.sin_port), forward_buffer);
            free(currentTime);
            fflush(stdout);
            broadcast(forward_buffer);
        }
    }
    char tmp[MAX_MSG_SIZE];
    bzero(tmp, sizeof(tmp));
    strcpy(tmp, cli->nickname);
    close(cli->clientfd);
    printf("[chd](%ld)[cli_sa](%s:%d) Client file descriptor is closed!\n", self, inet_ntoa(cli->clientsock.sin_addr), ntohs(cli->clientsock.sin_port));

    deleteNode(cli->clientfd);

    char *info = getInfo(tmp, LOGOUT);
    broadcast(info);
    free(info);

    displayAllClients();
    printf("[chd](%ld) Child thread is to return!\n", self);
    pthread_exit(NULL);
}

Client *createNode()
{
    Client *__client = (Client *)malloc(sizeof(Client));
    __client->next = NULL;
    bzero(__client->nickname, sizeof(__client->nickname));
    return __client;
}
int deleteNode(int targetfd)
{
    pthread_mutex_lock(&client_list_lock);
    Client *current = head->next, *prev = head;
    while (head != NULL)
    {
        if (current->clientfd == targetfd)
        {
            prev->next = current->next;
            free(current);
            pthread_mutex_unlock(&client_list_lock);
            return 1;
        }
        else
        {
            prev = current;
            current = current->next;
        }
    }
    pthread_mutex_unlock(&client_list_lock);
    return 0;
}
void insertNode(Client *newNode)
{
    pthread_mutex_lock(&client_list_lock);
    newNode->next = head->next;
    head->next = newNode;
    pthread_mutex_unlock(&client_list_lock);
}

void displayAllClients()
{
    pthread_mutex_lock(&client_list_lock);
    printf("====================\nClients:\n");
    for (Client *current = head->next; current != NULL; current = current->next)
    {
        printf("{nickname: %s, fd: %d, socket address: %s:%d}", current->nickname, current->clientfd, inet_ntoa(current->clientsock.sin_addr), ntohs(current->clientsock.sin_port));
        if (current->next != NULL)
        {
            printf("->");
        }
        fflush(stdout);
    }
    printf("\n====================\n");
    pthread_mutex_unlock(&client_list_lock);
}

void broadcast(const char *content)
{
    pthread_mutex_lock(&client_list_lock);
    Client *current = head->next;
    while (current != NULL)
    {
        write(current->clientfd, content, strlen(content));
        current = current->next;
    }
    pthread_mutex_unlock(&client_list_lock);
}

char *getCurrentTime()
{
    time_t currentTime;
    struct tm *localTime;
    char *timeString = (char *)malloc(sizeof(char) * 128);

    // 獲取當(dāng)前時(shí)間
    currentTime = time(NULL);

    // 轉(zhuǎn)換為本地時(shí)間
    localTime = localtime(&currentTime);

    // 格式化時(shí)間字符串
    strftime(timeString, 128, "%Y-%m-%d %H:%M:%S", localTime);

    return timeString;
}

void trim_linefeed(char *str)
{
    if (str[strlen(str) - 1] == '\n')
    {
        str[strlen(str) - 1] = '\0';
    }
}

char *getInfo(const char *nickname, int mode)
{
    char *str = (char *)malloc(MAX_FORWARD_MSG_SIZE);
    bzero(str, sizeof(str));
    char *currentTime = getCurrentTime();
    ;
    if (mode == LOGIN)
    {
        snprintf(str, MAX_FORWARD_MSG_SIZE, "%s\n[svr] User [%s] logged in\n", currentTime, nickname);
    }
    else
    {
        snprintf(str, MAX_CLIENT_CONNECTION, "%s\n[svr] User [%s] logged out\n", currentTime, nickname);
    }
    free(currentTime);
    return str;
}
svr.c

客戶端:

#include <stdio.h>
#include <stdlib.h>		//exit()函數(shù),atoi()函數(shù)
#include <unistd.h>		//C 和 C++ 程序設(shè)計(jì)語(yǔ)言中提供對(duì) POSIX 操作系統(tǒng) API 的訪問功能的頭文件
#include <sys/types.h>	//Linux系統(tǒng)的基本系統(tǒng)數(shù)據(jù)類型的頭文件,含有size_t,time_t,pid_t等類型
#include <sys/socket.h> //套接字基本函數(shù)
#include <netinet/in.h> //IP地址和端口相關(guān)定義,比如struct sockaddr_in等
#include <arpa/inet.h>	//inet_pton()等函數(shù)
#include <string.h>		//bzero()函數(shù)
#include <pthread.h>

#define MAX_MSG_SIZE 128
#define MAX_FORWARD_MSG_SIZE (MAX_MSG_SIZE + 64)

int exit_flag = 0;
int serverfd;
pthread_t sendTid, rcvdTid;

typedef struct _arg
{
	int serverfd;
} Arg;

void handleMessage(int socket);
void *sendHandler();
void *rcvdHandler();

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

	struct sockaddr_in server_addr; // 存放服務(wù)器端地址信息,connect()使用
	if (argc != 3)
	{ // 如果命令行用法不對(duì),則提醒并退出
		printf("usage: %s  <server IP address>  <server port>\n", argv[0]);
		exit(0);
	}

	char nickname[MAX_MSG_SIZE];

	while (!exit_flag)
	{
		bzero(nickname, sizeof(nickname));
		printf("enter your nickname to log in...\n>");
		fgets(nickname, MAX_MSG_SIZE, stdin);
		if (strlen(nickname) == 1)
		{
			printf("nickname cannot be null!\n");
		}
		else
		{
			break;
		}
	}

	if ((serverfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
	{
		perror("Create socket failed.");
		exit(1);
	}

	bzero(&server_addr, sizeof(server_addr));
	server_addr.sin_family = AF_INET;

	// argv[1] 為服務(wù)器IP字符串,需要用inet_pton轉(zhuǎn)換為IP地址
	if (inet_pton(AF_INET, argv[1], &server_addr.sin_addr) == 0)
	{
		perror("Server IP Address Error");
		exit(1);
	}

	// argv[2] 為服務(wù)器端口,需要用atoi及htons轉(zhuǎn)換
	server_addr.sin_port = htons(atoi(argv[2]));

	if (connect(serverfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
	{
		perror("connect failed");
		exit(1);
	}

	printf("[cli](%d)[srv_sa](%s:%s) Server is connected!\n", getpid(), argv[1], argv[2]);
	write(serverfd, nickname, strlen(nickname));
	handleMessage(serverfd);
	close(serverfd);
	printf("[cli] serverfd is closed!\n");
	printf("[cli] client is going to exit!\n");
	return 0;
}

void handleMessage(int socket)
{

	pthread_create(&sendTid, NULL, sendHandler, NULL);
	pthread_create(&rcvdTid, NULL, rcvdHandler, NULL);

	pthread_join(sendTid, NULL);
	pthread_join(rcvdTid, NULL);
}

void *sendHandler()
{
	pthread_t self = pthread_self();

	char buffer[MAX_MSG_SIZE + 2];
	int size, msgLen;
	while (!exit_flag)
	{
		bzero(buffer, sizeof(buffer));
		fflush(stdout);
		fgets(buffer, MAX_MSG_SIZE, stdin);
		if (strlen(buffer) == 1)
		{
			continue;
		}
		if (strcmp(buffer, "EXIT\n") == 0)
		{
			exit_flag = 1;
			break;
		}
		printf("[cli] Sending: %s", buffer);
		write(serverfd, buffer, strlen(buffer));
	}
	pthread_cancel(rcvdTid);
	pthread_exit(NULL);
}

void *rcvdHandler()
{
	pthread_t self = pthread_self();

	char buffer[MAX_FORWARD_MSG_SIZE];
	int size;
	while (!exit_flag)
	{
		bzero(buffer, sizeof(buffer));
		if ((size = read(serverfd, buffer, sizeof(buffer))) == -1)
		{
			perror("read");
			break;
		}
		else if (size == 0)
		{
			printf("[cli] server is closed!\n");
			exit_flag = 1;
			break;
		}
		else
		{
			printf("%s", buffer);
		}
	}
	pthread_cancel(sendTid);
	pthread_exit(NULL);
}
cli.c

Makefile:

.PHONY : all clean test

server=svr
client=cli
tarfile=chat.tar

all : $(server).c $(client).c
	gcc -o $(server) $(server).c -lpthread
	gcc -o $(client) $(client).c -lpthread

clean :
	rm -f ./$(server)
	rm -f ./$(client)
	rm -f ./$(tarfile)

package: clean all
	tar -cvf $(tarfile) $(server).c $(client).c
	
Makefile

演示

  1. 執(zhí)行編譯

c語(yǔ)言聊天室,c語(yǔ)言,tcp/ip

  1. 啟動(dòng)服務(wù)器

c語(yǔ)言聊天室,c語(yǔ)言,tcp/ip

  1. 啟動(dòng)客戶端

c語(yǔ)言聊天室,c語(yǔ)言,tcp/ip

  1. 聊天

c語(yǔ)言聊天室,c語(yǔ)言,tcp/ip

  1. 退出

c語(yǔ)言聊天室,c語(yǔ)言,tcp/ip文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-778088.html

到了這里,關(guān)于C語(yǔ)言Socket編程TCP簡(jiǎn)單聊天室的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • LinuxC TCP實(shí)現(xiàn)簡(jiǎn)易聊天室

    LinuxC TCP實(shí)現(xiàn)簡(jiǎn)易聊天室

    目錄 1.概述 1.1聊天室設(shè)計(jì)內(nèi)容 2.系統(tǒng)設(shè)計(jì) 2.1系統(tǒng)功能設(shè)計(jì) 2.1.1用戶管理 2.1.2聊天室管理 2.1.3聊天管理 2.2系統(tǒng)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì) 2.3系統(tǒng)主要函數(shù)設(shè)計(jì) 3.系統(tǒng)實(shí)現(xiàn) 3.2功能模塊的程序流程圖及運(yùn)行界面 3.2.1功能模塊流程圖 ?3.2.2運(yùn)行界面 4.源代碼 4.1客戶端 4.2服務(wù)器 注:存在問題 1

    2024年02月09日
    瀏覽(19)
  • 基于TCP協(xié)議的聊天室詳細(xì)教學(xué)(C++)

    基于TCP協(xié)議的聊天室詳細(xì)教學(xué)(C++)

    服務(wù)器只轉(zhuǎn)發(fā)消息不參到信息交流中 客戶端輸入用戶名后默認(rèn)進(jìn)入群聊模式,輸入“獲取用戶列表”可以獲取在線用戶用戶名列表,如果需要私聊某一個(gè)用戶需要輸入“私聊+用戶名”可進(jìn)入私聊模式,輸入“退出私聊”可退出私聊重新進(jìn)入群聊模式。 基本群聊展示 獲取用戶

    2024年02月08日
    瀏覽(23)
  • QT C++ 基于TCP通信的網(wǎng)絡(luò)聊天室

    QT C++ 基于TCP通信的網(wǎng)絡(luò)聊天室

    .ui .pro 在pro文件中添加network庫(kù) .h .main .cpp .ui .pro 在pro文件中添加network庫(kù) .h .main .cpp ? ? ? ?

    2024年02月09日
    瀏覽(23)
  • .NET編程——利用C#實(shí)現(xiàn)基于Socket類的聊天室(WinForm)

    .NET編程——利用C#實(shí)現(xiàn)基于Socket類的聊天室(WinForm)

    在學(xué)習(xí)C#和MySQL實(shí)現(xiàn)注冊(cè)登錄和TCP協(xié)議的Socket通信后,本文將介紹如何利用Socket類中的異步通信函數(shù)來(lái)實(shí)現(xiàn)本地聊天室功能, Socket通信限制了客戶端與客戶端之間的通信,客戶端只能接收來(lái)自服務(wù)器的消息而不能接收到客戶端發(fā)送的消息,因此服務(wù)器最佳的選擇是起到一個(gè)中

    2023年04月21日
    瀏覽(33)
  • 計(jì)算機(jī)網(wǎng)絡(luò) TCP/UDP程序開發(fā)網(wǎng)絡(luò)聊天室

    計(jì)算機(jī)網(wǎng)絡(luò) TCP/UDP程序開發(fā)網(wǎng)絡(luò)聊天室

    TCP/UDP程序開發(fā) 開發(fā)TCP/UDP協(xié)議應(yīng)用程序,掌握網(wǎng)絡(luò)應(yīng)用程序的工作原理。通過該實(shí)驗(yàn),深入理解UDP和TCP協(xié)議的異同點(diǎn),了解網(wǎng)絡(luò)協(xié)議的工作過程,學(xué)會(huì)網(wǎng)絡(luò)通信編程的基本方法,能夠編制網(wǎng)絡(luò)應(yīng)用程序。 (1)了解和掌握“基于UDP-面向無(wú)連接的應(yīng)用程序/基于TCP-面向連接的

    2024年02月05日
    瀏覽(22)
  • 【Unity 3D】利用C#、Unity和Socket實(shí)現(xiàn)簡(jiǎn)單的在線聊天室工具(附源碼 簡(jiǎn)單易懂)

    【Unity 3D】利用C#、Unity和Socket實(shí)現(xiàn)簡(jiǎn)單的在線聊天室工具(附源碼 簡(jiǎn)單易懂)

    需要源碼請(qǐng)點(diǎn)贊關(guān)注收藏后評(píng)論區(qū)留言并且私信~~~ 下面利用Unity和C#語(yǔ)言做一個(gè)簡(jiǎn)單的聊天室程序,主要用到的技術(shù)就是Socket通信連接,需要一個(gè)客戶端和一個(gè)服務(wù)器端,服務(wù)器端就使用C#語(yǔ)言的控制臺(tái)完成 下面就開始搭建C#語(yǔ)言服務(wù)器端 1:新建一個(gè)C#語(yǔ)言控制臺(tái)程序 2:命名

    2024年02月05日
    瀏覽(39)
  • QT程序設(shè)計(jì)多人聊天室(基于QT、sqlite3、TCP/IP)

    QT程序設(shè)計(jì)多人聊天室(基于QT、sqlite3、TCP/IP)

    目錄 技術(shù)路線 效果展示 程序主體 sqoperator.h mylogin.h myenroll.h chatinterface.h tips.h myapp.h ******************* sqoperator.cpp mylogin.cpp myenroll.cpp chatinterface.cpp tips.cpp myapp.cpp main.cpp widget.h widget.cpp main.cpp QT程序設(shè)計(jì)、sqlite數(shù)據(jù)庫(kù)調(diào)用、TCP/IP客戶端與服務(wù)端的搭建 通過次程序代碼,可以學(xué)習(xí)如

    2024年02月09日
    瀏覽(22)
  • 使用Linux系統(tǒng)IO多路復(fù)用中eopll創(chuàng)建基于TCP通信協(xié)議的多人聊天室

    一.1.搭建好TCP的通信模型 2.創(chuàng)建紅黑樹根節(jié)點(diǎn)?3.將套接字事件添加到紅黑樹中,使其被監(jiān)聽 4.當(dāng)套接字事件發(fā)生,表示有客戶端連接,將連接事件加入到紅黑樹節(jié)點(diǎn)當(dāng)中 5.每當(dāng)連接事件發(fā)生時(shí),表示客戶端發(fā)送信息到服務(wù)器 6.每當(dāng)有事件準(zhǔn)備就緒時(shí),將對(duì)應(yīng)的紅黑樹節(jié)點(diǎn)信息

    2024年02月13日
    瀏覽(19)
  • 【網(wǎng)絡(luò)編程】UDP簡(jiǎn)單實(shí)現(xiàn)翻譯軟件與網(wǎng)絡(luò)聊天室

    【網(wǎng)絡(luò)編程】UDP簡(jiǎn)單實(shí)現(xiàn)翻譯軟件與網(wǎng)絡(luò)聊天室

    在上一章【網(wǎng)絡(luò)編程】demo版UDP網(wǎng)絡(luò)服務(wù)器實(shí)現(xiàn)實(shí)現(xiàn)了客戶端和服務(wù)端之間的數(shù)據(jù)的發(fā)送與接收,上一章我們是直接讓服務(wù)端把接收到的數(shù)據(jù)打印出來(lái)。 但是服務(wù)端并不是只接收到數(shù)據(jù)就完了,它還要 處理任務(wù) 。 所以我們可以在服務(wù)端設(shè)置一個(gè)回調(diào)函數(shù): 用來(lái)處理接收到的

    2024年02月05日
    瀏覽(25)
  • 計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)與JAVA網(wǎng)絡(luò)編程手寫Socket聊天室-----JAVA入門基礎(chǔ)教程-----計(jì)算機(jī)網(wǎng)絡(luò)經(jīng)典

    import java.io.*; import java.net.Socket; import java.util.Scanner; public class ChatClient { public static void main(String[] args) { try { Socket socket = new Socket(\\\"127.0.0.1\\\",9090); new Thread(new Runnable() { @Override public void run() { InputStream inputStream = null; while(true) { try { inputStream = socket.getInputStream(); } catch (IOException e)

    2024年02月15日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包