[メモ]プログラムメモ_ソケット通信

Cとjavaでのソケット通信によるデータの送受信を確認できた.
確認用プログラムを自分用メモとして残します.
確認用なので,最小限の機能のみのプログラムです.
(エラー処理一切なし)
↓↓プログラムリスト↓↓


ーーーーーーーーーーーーー【javaサーバ】ーーーーーーーーーーーーー
import java.net.*;
import java.io.*;
public class TEST_server {
public static void main(String[] args) {
try{
// サーバーソケットの生成
ServerSocket serverSocket = new ServerSocket(5555);
System.out.println(“クライアントからの接続をポート5555で待ちます”);
// クライアントからの接続を待ちます
Socket socket = serverSocket.accept();
System.out.println(socket.getInetAddress() + “から接続を受付ました”);
// 出力ストリームを取得
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
// 入力ストリームを取得
BufferedReader in = new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
// 読み込んだ行をそのまま出力ストリームに書き出す
String inputLine;
inputLine = in.readLine();
System.out.println(inputLine);
System.out.println(“処理が終了したので接続を切ります”);
// 入出力ストリームを閉じる
out.close();
in.close();
// ソケットを閉じる
socket.close();
// サーバーソケットを閉じる
serverSocket.close();
} catch(IOException e){
e.printStackTrace();
}
}
}
ーーーーーーーーーーーーー【javaクライアント】ーーーーーーーーーーーーー
import java.net.*;
import java.io.*;
public class TEST_Client {
public static void main(String[] args){
try{
// ソケットを生成
Socket socket = new Socket(“localhost”, 5555);
              //↑”172.○○.○○.○○”でもOK!!
// 出力ストリームを取得
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
// 入力ストリームを取得
BufferedReader in = new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
// 以下のデータをサーバーに送る
out.println(“test hello world”);
// 入出力ストリームを閉じる
out.close();
in.close();
// ソケットを閉じる
socket.close();
} catch(IOException e){
e.printStackTrace();
}
}
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ーーーーーーーーーーーーー【Cサーバ】ーーーーーーーーーーーーー
#include <stdio.h>←半角にする
#include <winsock2.h>
int main(int argc, char* argv[]){
SOCKET s, s1; //ソケット
int result; //戻り値
//接続を許可するクライアント端末の情報
struct sockaddr_in source;
char buffer[1024]; //受信データのバッファ領域
//繰り返しサーバーとして働く
for(;;){
memset(&buffer, ‘\0’, sizeof(buffer));
//送信元の端末情報を登録する
memset(&source, 0, sizeof(source));
source.sin_family = AF_INET;
//ポート番号はクライアントプログラムと共通
source.sin_port = htons(5555);
source.sin_addr.s_addr = htonl(INADDR_ANY);
//ソケット通信の開始準備
WSADATA data;
result = WSAStartup(MAKEWORD(2, 0), &data);
//ソケットの生成
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//ソケットのバインド
result = bind(s, (struct sockaddr *)&source, sizeof(source));
//接続の許可
result = listen(s, 1);
printf(“接続開始\n”);
//クライアントから通信があるまで待機
s1 = accept(s, NULL, NULL);
//クライアントから送信されたデータの受信
result = recv(s1, buffer, sizeof(buffer), 0);
printf(“%sを受信しました\n”, buffer);
printf(“接続終了\n”);
closesocket(s1);
//ソケット通信の終了
WSACleanup();
}
}
ーーーーーーーーーーーーー【Cクライアント】ーーーーーーーーーーーーー
#include <stdio.h>←半角にする
#include <winsock2.h>
int main(void){
SOCKET s; //ソケット
//接続するサーバの情報
struct sockaddr_in dest;
//接続するサーバのIPアドレス
//xxx.xxx.xxx.xxxの形式で指定する
char destination[] = “172.○○.○○.○○”;
char buffer[1024];
//ソケット通信の準備
WSADATA data;
WSAStartup(MAKEWORD(2,0), &data);
//接続先(サーバ)のアドレス情報を設定
memset(&dest, 0, sizeof(dest));
//ポート番号はサーバプログラムと共通
dest.sin_port = htons(5555);
dest.sin_family = AF_INET;
dest.sin_addr.s_addr = inet_addr(destination);
//ソケットの生成
s = socket(AF_INET, SOCK_STREAM, 0);
//サーバへの接続
if(connect(s, (struct sockaddr *) &dest, sizeof(dest))){
printf(“%sに接続できませんでした\n”, destination);
return -1;
}
printf(“%sに接続しました\n”, destination);
printf(“サーバに送信する文字列を入力して下さい\n”);
scanf(“%s”, buffer);
//サーバにデータを送信
send(s, buffer, sizeof(buffer), 0);
// Windows でのソケットの終了
closesocket(s);
WSACleanup();
return 0;
}
ーーーーーーーーーーーーー【注意】ーーーーーーーーーーーーー
Cに関しては,以下の作業が必要.
両プロジェクトのプロパティにて
構成プロパティ
→リンカ
→コマンドライン
→追加のオプションに「ws2_32.lib」を追加

LEAVE A REPLY

*