SlideShare a Scribd company logo
1 of 16
2013

ネットワーク第 5 回
目
HTTP 通信/ソケット通信
1.

Socket 通信を行うプログラム
ソケット通信を利用したチャットクライアント(Android アプリ)とサーバプログラム
を作成します。今回は、サーバは自分の PC 内に起動させます。

※Android Virtual Device(AVD)の設定
Eclipse からエミュレータでデバッグを行うために、エミュレータの端末の設定を追加しま
す。
Eclipse のメニューから[ウインドウ]->[AVD Manager]を選択し、
[New]ボタンをクリック。
以下のように設定してください。

ソースコード(クライアント側)
Eclipse を開いて、パッケージエクスプローラーで右クリックし、[新規]->[Android プ
ロジェクト]を選択します。
プロジェクト名は
「SocketEx」
としてください。
Target SDK
と Compile With は Android4.0(IceCreamSandwich)を選びます。ActivityName は
「SocketEx」としましょう。
package com.example.socketex;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
public class SocketEx extends Activity implements View.OnClickListener{
private final static String BR = System.getProperty("line.separator");
private final static int WC = LinearLayout.LayoutParams.WRAP_CONTENT;
private final static int MP = LinearLayout.LayoutParams.MATCH_PARENT;
private static final String ADDRESS = "192.168.1.100"; ※変更すること!
private TextViewlblReceive;
private EditTexteditText;
private Button btnSend;
private Socket socket;
private InputStream in;
private OutputStream out;
private boolean error;
private final Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
LinearLayout layout = new LinearLayout(this);
layout.setBackgroundColor(Color.rgb(255,255,255));
layout.setOrientation(LinearLayout.VERTICAL);
setContentView(layout);
editText = new EditText(this);
editText.setId(2);
editText.setText("", TextView.BufferType.NORMAL);
editText.setLayoutParams(new

LinearLayout.LayoutParams(MP,

WC));
layout.addView(editText);
btnSend = new Button(this);
btnSend.setText("送信");
btnSend.setOnClickListener(this);
btnSend.setLayoutParams(new

LinearLayout.LayoutParams(WC,

WC));
layout.addView(btnSend);
lblReceive = new TextView(this);
lblReceive.setId(1);
lblReceive.setText("");
lblReceive.setTextSize(16.0f);
lblReceive.setTextColor(Color.rgb(0, 0, 0));
lblReceive.setLayoutParams(new
WC));
layout.addView(lblReceive);

LinearLayout.LayoutParams(MP,
}
@Override
public void onStart() {
super.onStart();
Thread thread = new Thread() {
public void run() {
try {
connect(ADDRESS, 8080);
} catch (Exception e) {
}
}
};
thread.start();
}
@Override
public void onStop() {
super.onStop();
disconnect();
}
private void addText(final String text) {
handler.post(new Runnable() {
@Override
public void run() {
lblReceive.setText(text + BR + lblReceive.getText());
}
});
}
private void connect(String address, int port) {
int size;
String str;
byte[] w = new byte[1024];
try {
addText("接続中");
socket = new Socket(address, port);
in = socket.getInputStream();
out = socket.getOutputStream();
addText("接続完了");
while(socket != null &&socket.isConnected()) {
size = in.read(w);
if (size <= 0) {
continue;
}
str = new String(w, 0, size, "UTF-8");
addText(str);
}
} catch (Exception e) {
addText("通信に失敗しました。");
}
}
private void disconnect() {
try {
socket.close();
socket = null;
} catch (Exception e) {
}
}
@Override
public void onClick(View v) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
error = false;
try {
if (socket != null &&socket.isConnected()) {
byte[]

w

=

editText.getText().toString().getBytes("UTF8");
out.write(w);
out.flush();
}
} catch (Exception e) {
error = true;
}
handler.post(new Runnable() {
public void run() {
if (error) {
addText(" 通 信 に 失 敗 し ま
した");
} else {
editText.setText("",
TextView.BufferType.NORMAL);
}
}
});
}
});
thread.start();
}
}
ソースコード(サーバ側)
Eclipse で新規 Java プロジェクト『chatserver』を作成します。作成したら、src フォルダ
の直下に、
『ChatServer.java』
『CharServerThread.java』2 つの java ファイルを作成しま
す。ソースコードはそれぞれ以下のように記述します。
○ChatServer.java
package com.example;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
*
* This class launches the web application in an embedded Jetty container.
* This is the entry point to your application. The Java command that is used for
* launching should fire this main method.
*
*/
public class ChatServer {
public void start(int port) {
ServerSocket server;
Socket socket;
ChatServerThread thread;
try {
server = new ServerSocket(port);
System.err.println("ChatServer start" +
"¥nIP

Address:"

InetAddress.getLocalHost().getHostAddress()
+ "¥nPort:" + port);
while (true) {
try {
socket = server.accept();
thread = new ChatServerThread(socket);
thread.start();
} catch (IOException e) {
System.out.println(e);
}

+
}
} catch (IOException e) {
System.err.println(e);
}
}
public static void main(String[] args) throws Exception{
ChatServer server = new ChatServer();
server.start(8080);
}
}
○ChatServerThread.java
package com.example;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class ChatServerThread extends Thread {
private

static

List<ChatServerThread>

ArrayList<ChatServerThread>();
private Socket socket;
public ChatServerThread(Socket socket) {
super();
this.socket = socket;
threads.add(this);
}

threads

=

new
public void run() {
InputStream in = null;
String message;
int size;
byte[] w = new byte[10240];
try {
System.err.println("ChatServerThread start");
in = socket.getInputStream();
while(true) {
try {
size = in.read(w);
if (size <= 0) {
throw new IOException();
}
message = new String(w, 0, size, "UTF8");
System.out.println(message);
sendMessageAll(message);
} catch(IOException e) {
System.out.println("ChatServerThread
stop");
socket.close();
threads.remove(this);
return;
}
}
} catch (IOException e) {
System.err.println(e);
}
}
public void sendMessageAll(String message) {
for (ChatServerThread thread : threads) {
if (thread.isAlive()) {
thread.sendMessage(this, message);
}
}
System.out.println(message);
}
public void sendMessage(ChatServerThread talker, String message) {
try {
OutputStream out = socket.getOutputStream();
byte[] w = message.getBytes("UTF8");
out.write(w);
out.flush();
} catch (IOException e) {
}
}
}
ソースを記述したら、Java アプリケーションとして実行してください。
その後、Android アプリを起動します。
2.

HTTP 通信を行う Android アプリ

HTTP 通信の GET/POST メソッドを行ってネット上の情報を表示するアプリを作成します。
ソースコード
Eclipse を開いて、パッケージエクスプローラーで右クリックし、[新規]->[Android プロジ
ェクト]を選択します。
プロジェクト名は
「HttpEx」
としてください。
Target SDK と Compile
With は Android4.0(IceCreamSandwich)を選びます。ActivityName は「HttpEx」としま
しょう。
プロジェクトが作成出来たら、src.com.example.httpex フォルダの HttpEx.java ファイル
を以下のように編集してください。
また、AndroidManifest.xml を開き、
『Permission』タブの中の Add ボタンをクリックし
て、
『User Permission』を選択します。Name は『android.permission.INTERNET』を選
択してください。
package com.example.httpex;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
public class HttpEx extends Activity implements View.OnClickListener{
private static final int WC = LinearLayout.LayoutParams.WRAP_CONTENT;
private static final int MP = LinearLayout.LayoutParams.MATCH_PARENT;
private EditTexteditText;
// リクエスト先の URL
private static final String URL = "http://httpserverex.herokuapp.com/hello";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
// レイアウトの生成
LinearLayout layout = new LinearLayout(this);
layout.setBackgroundColor(Color.rgb(255, 255, 255));
layout.setOrientation(LinearLayout.VERTICAL);
setContentView(layout);
// エディットテキストの生成
editText = new EditText(this);
editText.setText("", EditText.BufferType.NORMAL);
editText.setLayoutParams(new

LinearLayout.LayoutParams(MP,

WC));
layout.addView(editText);
layout.addView(makeButton("HTTP 通信", "read"));
}
/**
* ボタンの生成
* @param text
* @param tag
* @return
*/
private Button makeButton(String text, String tag) {
Button button = new Button(this);
button.setText(text);
button.setTag(tag);
button.setOnClickListener(this);
button.setLayoutParams(new

LinearLayout.LayoutParams(WC,

WC));
return button;
}
@Override
public void onClick(View arg0) {
String tag = (String) arg0.getTag();
if (tag.equals("read")) {
Thread thread = new Thread(new Runnable() {
String text = null;
@Override
public void run() {
// HTTP 通信
try {
text

=

String(httpToData(URL));
} catch (Exception e) {
text = null;
}
Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
if (text != null) {
editText.setText(text, TextView.BufferType.EDITABLE);
} else {
HttpEx.showDialog(HttpEx.this, "エラー", "読み込みに失敗しました");
}
}
});
}
});
thread.start();
}
}
public static byte[] httpToData(String path) throws Exception {
byte[] write = new byte[1024];
HttpURLConnection connection = null;
InputStream in = null;
ByteArrayOutputStream out = null;
try {
// HTTP 接続のオープン

new
URL url = new URL(path);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.connect();
in = connection.getInputStream();
out = new ByteArrayOutputStream();
int size;
while ((size = in.read(write)) > 0) {
out.write(write, 0, size);
}
out.close();
in.close();
connection.disconnect();
return out.toByteArray();
} catch (Exception e) {
try {
if (connection != null) {
connection.disconnect();
}
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
} catch (Exception e2) {
}
throw e;
}
}
private static void showDialog(Context context, String title, String text) {
AlertDialog.Builder ad = new AlertDialog.Builder(context);
ad.setTitle(title);
ad.setMessage(text);
ad.setPositiveButton("OK", null);
ad.show();
}
}
ソースが記述出来たら、Android Application として実行してください。
<演習>
GET リクエストで上記の URL にアクセスしていますが、POST 用のボタンを追加し、そ
のボタンをクリックされた場合は、POST リクエストを行うように修正しなさい。
また、リクエストクエリも追加で送信出来るように修正しなさい。

More Related Content

What's hot

Team Foundation Server / Visual Studio Team Services によるプロジェクト管理・リポジトリ管理・継続的イ...
Team Foundation Server / Visual Studio Team Services によるプロジェクト管理・リポジトリ管理・継続的イ...Team Foundation Server / Visual Studio Team Services によるプロジェクト管理・リポジトリ管理・継続的イ...
Team Foundation Server / Visual Studio Team Services によるプロジェクト管理・リポジトリ管理・継続的イ...Masaki Takeda
 
Visual Studio と Team Foundation Server / Visual Studio Team Services で実現するビル...
Visual Studio  と Team Foundation Server / Visual Studio Team Services で実現するビル...Visual Studio  と Team Foundation Server / Visual Studio Team Services で実現するビル...
Visual Studio と Team Foundation Server / Visual Studio Team Services で実現するビル...Masaki Takeda
 
Team Foundation Server / Visual Studio Team Services 手順書
Team Foundation Server /Visual Studio Team Services 手順書Team Foundation Server /Visual Studio Team Services 手順書
Team Foundation Server / Visual Studio Team Services 手順書Masaki Takeda
 
Visual Studio Code 拡張の勘所
Visual Studio Code 拡張の勘所Visual Studio Code 拡張の勘所
Visual Studio Code 拡張の勘所Masaki Takeda
 
Team Foundation Server プロセステンプレートの変更 手順書
Team Foundation Server プロセステンプレートの変更 手順書Team Foundation Server プロセステンプレートの変更 手順書
Team Foundation Server プロセステンプレートの変更 手順書Masaki Takeda
 
Team Foundation Server 2015 Update 3 インストール 手順書 ~ SQL Server インストールから チームプロジェ...
Team Foundation Server 2015 Update 3インストール 手順書~ SQL Server インストールから チームプロジェ...Team Foundation Server 2015 Update 3インストール 手順書~ SQL Server インストールから チームプロジェ...
Team Foundation Server 2015 Update 3 インストール 手順書 ~ SQL Server インストールから チームプロジェ...Masaki Takeda
 
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825 Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825 miso- soup3
 
Team Founfation Server / Visual Studio Online ハンズオン トレーニング手順書
Team Founfation Server / Visual Studio Online  ハンズオン トレーニング手順書Team Founfation Server / Visual Studio Online  ハンズオン トレーニング手順書
Team Founfation Server / Visual Studio Online ハンズオン トレーニング手順書Masaki Takeda
 
Team Foundation Server 2015 による テスト工数削減
Team Foundation Server 2015 によるテスト工数削減Team Foundation Server 2015 によるテスト工数削減
Team Foundation Server 2015 による テスト工数削減Masaki Takeda
 
もう怖くない! Team Foundation Server 2015 Update 1 ワークアイテム管理と テンプレートのカスタマイズ 概要
もう怖くない!Team Foundation Server 2015 Update 1 ワークアイテム管理とテンプレートのカスタマイズ 概要もう怖くない!Team Foundation Server 2015 Update 1 ワークアイテム管理とテンプレートのカスタマイズ 概要
もう怖くない! Team Foundation Server 2015 Update 1 ワークアイテム管理と テンプレートのカスタマイズ 概要Masaki Takeda
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!Shohei Okada
 
「Entity Framework Coreを使ってみる」 公開用
「Entity Framework Coreを使ってみる」 公開用「Entity Framework Coreを使ってみる」 公開用
「Entity Framework Coreを使ってみる」 公開用ESM SEC
 
Visual Studio 2017 と Team Foundation Server / Visual Studio Team Services で実現...
Visual Studio 2017 とTeam Foundation Server /Visual Studio Team Services で実現...Visual Studio 2017 とTeam Foundation Server /Visual Studio Team Services で実現...
Visual Studio 2017 と Team Foundation Server / Visual Studio Team Services で実現...Masaki Takeda
 
JavaScriptでWebDriverのテストコードを書きましょ
JavaScriptでWebDriverのテストコードを書きましょJavaScriptでWebDriverのテストコードを書きましょ
JavaScriptでWebDriverのテストコードを書きましょKohki Nakashima
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようずOda Shinsuke
 
Android test tutorial
Android test tutorialAndroid test tutorial
Android test tutorialKazuaki Ueda
 
Team Foundation Server 2015 Update 3 アップグレード 手順書 ~ Team Foundation Server 201...
Team Foundation Server 2015 Update 3アップグレード 手順書~ Team Foundation Server 201...Team Foundation Server 2015 Update 3アップグレード 手順書~ Team Foundation Server 201...
Team Foundation Server 2015 Update 3 アップグレード 手順書 ~ Team Foundation Server 201...Masaki Takeda
 
Angular2 rc.1 unit testing overview
Angular2 rc.1 unit testing overviewAngular2 rc.1 unit testing overview
Angular2 rc.1 unit testing overviewMitsuru Ogawa
 

What's hot (20)

Team Foundation Server / Visual Studio Team Services によるプロジェクト管理・リポジトリ管理・継続的イ...
Team Foundation Server / Visual Studio Team Services によるプロジェクト管理・リポジトリ管理・継続的イ...Team Foundation Server / Visual Studio Team Services によるプロジェクト管理・リポジトリ管理・継続的イ...
Team Foundation Server / Visual Studio Team Services によるプロジェクト管理・リポジトリ管理・継続的イ...
 
Visual Studio と Team Foundation Server / Visual Studio Team Services で実現するビル...
Visual Studio  と Team Foundation Server / Visual Studio Team Services で実現するビル...Visual Studio  と Team Foundation Server / Visual Studio Team Services で実現するビル...
Visual Studio と Team Foundation Server / Visual Studio Team Services で実現するビル...
 
Team Foundation Server / Visual Studio Team Services 手順書
Team Foundation Server /Visual Studio Team Services 手順書Team Foundation Server /Visual Studio Team Services 手順書
Team Foundation Server / Visual Studio Team Services 手順書
 
Visual Studio Code 拡張の勘所
Visual Studio Code 拡張の勘所Visual Studio Code 拡張の勘所
Visual Studio Code 拡張の勘所
 
Team Foundation Server プロセステンプレートの変更 手順書
Team Foundation Server プロセステンプレートの変更 手順書Team Foundation Server プロセステンプレートの変更 手順書
Team Foundation Server プロセステンプレートの変更 手順書
 
Team Foundation Server 2015 Update 3 インストール 手順書 ~ SQL Server インストールから チームプロジェ...
Team Foundation Server 2015 Update 3インストール 手順書~ SQL Server インストールから チームプロジェ...Team Foundation Server 2015 Update 3インストール 手順書~ SQL Server インストールから チームプロジェ...
Team Foundation Server 2015 Update 3 インストール 手順書 ~ SQL Server インストールから チームプロジェ...
 
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825 Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
 
Team Founfation Server / Visual Studio Online ハンズオン トレーニング手順書
Team Founfation Server / Visual Studio Online  ハンズオン トレーニング手順書Team Founfation Server / Visual Studio Online  ハンズオン トレーニング手順書
Team Founfation Server / Visual Studio Online ハンズオン トレーニング手順書
 
Team Foundation Server 2015 による テスト工数削減
Team Foundation Server 2015 によるテスト工数削減Team Foundation Server 2015 によるテスト工数削減
Team Foundation Server 2015 による テスト工数削減
 
もう怖くない! Team Foundation Server 2015 Update 1 ワークアイテム管理と テンプレートのカスタマイズ 概要
もう怖くない!Team Foundation Server 2015 Update 1 ワークアイテム管理とテンプレートのカスタマイズ 概要もう怖くない!Team Foundation Server 2015 Update 1 ワークアイテム管理とテンプレートのカスタマイズ 概要
もう怖くない! Team Foundation Server 2015 Update 1 ワークアイテム管理と テンプレートのカスタマイズ 概要
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
 
「Entity Framework Coreを使ってみる」 公開用
「Entity Framework Coreを使ってみる」 公開用「Entity Framework Coreを使ってみる」 公開用
「Entity Framework Coreを使ってみる」 公開用
 
Visual Studio 2017 と Team Foundation Server / Visual Studio Team Services で実現...
Visual Studio 2017 とTeam Foundation Server /Visual Studio Team Services で実現...Visual Studio 2017 とTeam Foundation Server /Visual Studio Team Services で実現...
Visual Studio 2017 と Team Foundation Server / Visual Studio Team Services で実現...
 
JavaScriptでWebDriverのテストコードを書きましょ
JavaScriptでWebDriverのテストコードを書きましょJavaScriptでWebDriverのテストコードを書きましょ
JavaScriptでWebDriverのテストコードを書きましょ
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
 
Android test tutorial
Android test tutorialAndroid test tutorial
Android test tutorial
 
Team Foundation Server 2015 Update 3 アップグレード 手順書 ~ Team Foundation Server 201...
Team Foundation Server 2015 Update 3アップグレード 手順書~ Team Foundation Server 201...Team Foundation Server 2015 Update 3アップグレード 手順書~ Team Foundation Server 201...
Team Foundation Server 2015 Update 3 アップグレード 手順書 ~ Team Foundation Server 201...
 
Vue入門
Vue入門Vue入門
Vue入門
 
CLRH_120414_WFTDD
CLRH_120414_WFTDDCLRH_120414_WFTDD
CLRH_120414_WFTDD
 
Angular2 rc.1 unit testing overview
Angular2 rc.1 unit testing overviewAngular2 rc.1 unit testing overview
Angular2 rc.1 unit testing overview
 

Similar to ネットワーク第5回

Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51
Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51
Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51Takakiyo Tanaka
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejsTakayoshi Tanaka
 
jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発Akira Inoue
 
C#版人狼知能エージェントの作り方~Visual Studio編~(AIWolf.NET 1.0.6版)
C#版人狼知能エージェントの作り方~Visual Studio編~(AIWolf.NET 1.0.6版)C#版人狼知能エージェントの作り方~Visual Studio編~(AIWolf.NET 1.0.6版)
C#版人狼知能エージェントの作り方~Visual Studio編~(AIWolf.NET 1.0.6版)takots
 
Titanium Mobile
Titanium MobileTitanium Mobile
Titanium MobileNaoya Ito
 
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るnode+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るKiyoshi SATOH
 
cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携Tomoaki Shimizu
 
CEDEC 2013 Unity on Windows 8
CEDEC 2013 Unity on Windows 8CEDEC 2013 Unity on Windows 8
CEDEC 2013 Unity on Windows 8Akira Onishi
 
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考える
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考えるNetラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考える
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考えるdavid9142
 
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)JPCERT Coordination Center
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugY Watanabe
 
Pro aspnetmvc3framework chap19
Pro aspnetmvc3framework chap19Pro aspnetmvc3framework chap19
Pro aspnetmvc3framework chap19Hideki Hashizume
 
How to Make Own Framework built on OWIN
How to Make Own Framework built on OWINHow to Make Own Framework built on OWIN
How to Make Own Framework built on OWINYoshifumi Kawai
 
.NET CoreとVS Codeで作る人狼知能
.NET CoreとVS Codeで作る人狼知能.NET CoreとVS Codeで作る人狼知能
.NET CoreとVS Codeで作る人狼知能takots
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略takezoe
 
AppiumのWebViewアプリテストの仕組みとハマりどころ
AppiumのWebViewアプリテストの仕組みとハマりどころAppiumのWebViewアプリテストの仕組みとハマりどころ
AppiumのWebViewアプリテストの仕組みとハマりどころMasayuki Wakizaka
 
Web1.0のハイブリッドアプリ開発
Web1.0のハイブリッドアプリ開発Web1.0のハイブリッドアプリ開発
Web1.0のハイブリッドアプリ開発Kenta Tsuji
 

Similar to ネットワーク第5回 (20)

Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51
Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51
Eclipse と Liberty プロファイルで始める Java EE 開発ハンズオン #jjug_ccc #ccc_r51
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発
 
C#版人狼知能エージェントの作り方~Visual Studio編~(AIWolf.NET 1.0.6版)
C#版人狼知能エージェントの作り方~Visual Studio編~(AIWolf.NET 1.0.6版)C#版人狼知能エージェントの作り方~Visual Studio編~(AIWolf.NET 1.0.6版)
C#版人狼知能エージェントの作り方~Visual Studio編~(AIWolf.NET 1.0.6版)
 
Titanium Mobile
Titanium MobileTitanium Mobile
Titanium Mobile
 
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るnode+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作る
 
cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携
 
CEDEC 2013 Unity on Windows 8
CEDEC 2013 Unity on Windows 8CEDEC 2013 Unity on Windows 8
CEDEC 2013 Unity on Windows 8
 
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考える
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考えるNetラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考える
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考える
 
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
 
Pro aspnetmvc3framework chap19
Pro aspnetmvc3framework chap19Pro aspnetmvc3framework chap19
Pro aspnetmvc3framework chap19
 
sveltekit-ja.pdf
sveltekit-ja.pdfsveltekit-ja.pdf
sveltekit-ja.pdf
 
How to Make Own Framework built on OWIN
How to Make Own Framework built on OWINHow to Make Own Framework built on OWIN
How to Make Own Framework built on OWIN
 
.NET CoreとVS Codeで作る人狼知能
.NET CoreとVS Codeで作る人狼知能.NET CoreとVS Codeで作る人狼知能
.NET CoreとVS Codeで作る人狼知能
 
Ajax basic
Ajax basicAjax basic
Ajax basic
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略
 
AppiumのWebViewアプリテストの仕組みとハマりどころ
AppiumのWebViewアプリテストの仕組みとハマりどころAppiumのWebViewアプリテストの仕組みとハマりどころ
AppiumのWebViewアプリテストの仕組みとハマりどころ
 
G0042 h
G0042 hG0042 h
G0042 h
 
Web1.0のハイブリッドアプリ開発
Web1.0のハイブリッドアプリ開発Web1.0のハイブリッドアプリ開発
Web1.0のハイブリッドアプリ開発
 

More from Yukiko Kato

Javaデザインパターン入門【第3回】
Javaデザインパターン入門【第3回】Javaデザインパターン入門【第3回】
Javaデザインパターン入門【第3回】Yukiko Kato
 
Javaデザインパターン入門【第2回】
Javaデザインパターン入門【第2回】Javaデザインパターン入門【第2回】
Javaデザインパターン入門【第2回】Yukiko Kato
 
Javaプログラミング入門【第9回】
Javaプログラミング入門【第9回】Javaプログラミング入門【第9回】
Javaプログラミング入門【第9回】Yukiko Kato
 
ネットワーク第9回
ネットワーク第9回ネットワーク第9回
ネットワーク第9回Yukiko Kato
 
Javaプログラミング入門【第8回】
Javaプログラミング入門【第8回】Javaプログラミング入門【第8回】
Javaプログラミング入門【第8回】Yukiko Kato
 
ネットワーク第8回目
ネットワーク第8回目ネットワーク第8回目
ネットワーク第8回目Yukiko Kato
 
Javaプログラミング入門【第7回】
Javaプログラミング入門【第7回】Javaプログラミング入門【第7回】
Javaプログラミング入門【第7回】Yukiko Kato
 
ネットワーク第7回
ネットワーク第7回ネットワーク第7回
ネットワーク第7回Yukiko Kato
 
[PS11]ネットワーク第6回
[PS11]ネットワーク第6回[PS11]ネットワーク第6回
[PS11]ネットワーク第6回Yukiko Kato
 
Javaプログラミング入門【第6回】
Javaプログラミング入門【第6回】Javaプログラミング入門【第6回】
Javaプログラミング入門【第6回】Yukiko Kato
 
ネットワーク第6回
ネットワーク第6回ネットワーク第6回
ネットワーク第6回Yukiko Kato
 
[PS11]ネットワーク第5回
[PS11]ネットワーク第5回[PS11]ネットワーク第5回
[PS11]ネットワーク第5回Yukiko Kato
 
Javaプログラミング入門【第5回】
Javaプログラミング入門【第5回】Javaプログラミング入門【第5回】
Javaプログラミング入門【第5回】Yukiko Kato
 
Javaプログラミング入門【第4回】
Javaプログラミング入門【第4回】Javaプログラミング入門【第4回】
Javaプログラミング入門【第4回】Yukiko Kato
 
ネットワーク第4回目
ネットワーク第4回目ネットワーク第4回目
ネットワーク第4回目Yukiko Kato
 
Javaプログラミング入門【第3回】
Javaプログラミング入門【第3回】Javaプログラミング入門【第3回】
Javaプログラミング入門【第3回】Yukiko Kato
 
ネットワーク第3回目
ネットワーク第3回目ネットワーク第3回目
ネットワーク第3回目Yukiko Kato
 
Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】Yukiko Kato
 
HTTPとは(HerokuとADTで実践編)
HTTPとは(HerokuとADTで実践編)HTTPとは(HerokuとADTで実践編)
HTTPとは(HerokuとADTで実践編)Yukiko Kato
 
Javaプログラミング入門【第1回】
Javaプログラミング入門【第1回】Javaプログラミング入門【第1回】
Javaプログラミング入門【第1回】Yukiko Kato
 

More from Yukiko Kato (20)

Javaデザインパターン入門【第3回】
Javaデザインパターン入門【第3回】Javaデザインパターン入門【第3回】
Javaデザインパターン入門【第3回】
 
Javaデザインパターン入門【第2回】
Javaデザインパターン入門【第2回】Javaデザインパターン入門【第2回】
Javaデザインパターン入門【第2回】
 
Javaプログラミング入門【第9回】
Javaプログラミング入門【第9回】Javaプログラミング入門【第9回】
Javaプログラミング入門【第9回】
 
ネットワーク第9回
ネットワーク第9回ネットワーク第9回
ネットワーク第9回
 
Javaプログラミング入門【第8回】
Javaプログラミング入門【第8回】Javaプログラミング入門【第8回】
Javaプログラミング入門【第8回】
 
ネットワーク第8回目
ネットワーク第8回目ネットワーク第8回目
ネットワーク第8回目
 
Javaプログラミング入門【第7回】
Javaプログラミング入門【第7回】Javaプログラミング入門【第7回】
Javaプログラミング入門【第7回】
 
ネットワーク第7回
ネットワーク第7回ネットワーク第7回
ネットワーク第7回
 
[PS11]ネットワーク第6回
[PS11]ネットワーク第6回[PS11]ネットワーク第6回
[PS11]ネットワーク第6回
 
Javaプログラミング入門【第6回】
Javaプログラミング入門【第6回】Javaプログラミング入門【第6回】
Javaプログラミング入門【第6回】
 
ネットワーク第6回
ネットワーク第6回ネットワーク第6回
ネットワーク第6回
 
[PS11]ネットワーク第5回
[PS11]ネットワーク第5回[PS11]ネットワーク第5回
[PS11]ネットワーク第5回
 
Javaプログラミング入門【第5回】
Javaプログラミング入門【第5回】Javaプログラミング入門【第5回】
Javaプログラミング入門【第5回】
 
Javaプログラミング入門【第4回】
Javaプログラミング入門【第4回】Javaプログラミング入門【第4回】
Javaプログラミング入門【第4回】
 
ネットワーク第4回目
ネットワーク第4回目ネットワーク第4回目
ネットワーク第4回目
 
Javaプログラミング入門【第3回】
Javaプログラミング入門【第3回】Javaプログラミング入門【第3回】
Javaプログラミング入門【第3回】
 
ネットワーク第3回目
ネットワーク第3回目ネットワーク第3回目
ネットワーク第3回目
 
Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】
 
HTTPとは(HerokuとADTで実践編)
HTTPとは(HerokuとADTで実践編)HTTPとは(HerokuとADTで実践編)
HTTPとは(HerokuとADTで実践編)
 
Javaプログラミング入門【第1回】
Javaプログラミング入門【第1回】Javaプログラミング入門【第1回】
Javaプログラミング入門【第1回】
 

Recently uploaded

TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成Hiroshi Tomioka
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 

Recently uploaded (9)

TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 

ネットワーク第5回

  • 1. 2013 ネットワーク第 5 回 目 HTTP 通信/ソケット通信
  • 2. 1. Socket 通信を行うプログラム ソケット通信を利用したチャットクライアント(Android アプリ)とサーバプログラム を作成します。今回は、サーバは自分の PC 内に起動させます。 ※Android Virtual Device(AVD)の設定 Eclipse からエミュレータでデバッグを行うために、エミュレータの端末の設定を追加しま す。 Eclipse のメニューから[ウインドウ]->[AVD Manager]を選択し、 [New]ボタンをクリック。 以下のように設定してください。 ソースコード(クライアント側) Eclipse を開いて、パッケージエクスプローラーで右クリックし、[新規]->[Android プ
  • 3. ロジェクト]を選択します。 プロジェクト名は 「SocketEx」 としてください。 Target SDK と Compile With は Android4.0(IceCreamSandwich)を選びます。ActivityName は 「SocketEx」としましょう。 package com.example.socketex; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.view.Window; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; public class SocketEx extends Activity implements View.OnClickListener{ private final static String BR = System.getProperty("line.separator"); private final static int WC = LinearLayout.LayoutParams.WRAP_CONTENT; private final static int MP = LinearLayout.LayoutParams.MATCH_PARENT; private static final String ADDRESS = "192.168.1.100"; ※変更すること! private TextViewlblReceive; private EditTexteditText; private Button btnSend; private Socket socket; private InputStream in; private OutputStream out; private boolean error;
  • 4. private final Handler handler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); LinearLayout layout = new LinearLayout(this); layout.setBackgroundColor(Color.rgb(255,255,255)); layout.setOrientation(LinearLayout.VERTICAL); setContentView(layout); editText = new EditText(this); editText.setId(2); editText.setText("", TextView.BufferType.NORMAL); editText.setLayoutParams(new LinearLayout.LayoutParams(MP, WC)); layout.addView(editText); btnSend = new Button(this); btnSend.setText("送信"); btnSend.setOnClickListener(this); btnSend.setLayoutParams(new LinearLayout.LayoutParams(WC, WC)); layout.addView(btnSend); lblReceive = new TextView(this); lblReceive.setId(1); lblReceive.setText(""); lblReceive.setTextSize(16.0f); lblReceive.setTextColor(Color.rgb(0, 0, 0)); lblReceive.setLayoutParams(new WC)); layout.addView(lblReceive); LinearLayout.LayoutParams(MP,
  • 5. } @Override public void onStart() { super.onStart(); Thread thread = new Thread() { public void run() { try { connect(ADDRESS, 8080); } catch (Exception e) { } } }; thread.start(); } @Override public void onStop() { super.onStop(); disconnect(); } private void addText(final String text) { handler.post(new Runnable() { @Override public void run() { lblReceive.setText(text + BR + lblReceive.getText()); } }); } private void connect(String address, int port) { int size; String str;
  • 6. byte[] w = new byte[1024]; try { addText("接続中"); socket = new Socket(address, port); in = socket.getInputStream(); out = socket.getOutputStream(); addText("接続完了"); while(socket != null &&socket.isConnected()) { size = in.read(w); if (size <= 0) { continue; } str = new String(w, 0, size, "UTF-8"); addText(str); } } catch (Exception e) { addText("通信に失敗しました。"); } } private void disconnect() { try { socket.close(); socket = null; } catch (Exception e) { } } @Override public void onClick(View v) { Thread thread = new Thread(new Runnable() { @Override
  • 7. public void run() { error = false; try { if (socket != null &&socket.isConnected()) { byte[] w = editText.getText().toString().getBytes("UTF8"); out.write(w); out.flush(); } } catch (Exception e) { error = true; } handler.post(new Runnable() { public void run() { if (error) { addText(" 通 信 に 失 敗 し ま した"); } else { editText.setText("", TextView.BufferType.NORMAL); } } }); } }); thread.start(); } } ソースコード(サーバ側) Eclipse で新規 Java プロジェクト『chatserver』を作成します。作成したら、src フォルダ の直下に、 『ChatServer.java』 『CharServerThread.java』2 つの java ファイルを作成しま す。ソースコードはそれぞれ以下のように記述します。 ○ChatServer.java
  • 8. package com.example; import java.io.IOException; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; /** * * This class launches the web application in an embedded Jetty container. * This is the entry point to your application. The Java command that is used for * launching should fire this main method. * */ public class ChatServer { public void start(int port) { ServerSocket server; Socket socket; ChatServerThread thread; try { server = new ServerSocket(port); System.err.println("ChatServer start" + "¥nIP Address:" InetAddress.getLocalHost().getHostAddress() + "¥nPort:" + port); while (true) { try { socket = server.accept(); thread = new ChatServerThread(socket); thread.start(); } catch (IOException e) { System.out.println(e); } +
  • 9. } } catch (IOException e) { System.err.println(e); } } public static void main(String[] args) throws Exception{ ChatServer server = new ChatServer(); server.start(8080); } } ○ChatServerThread.java package com.example; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.util.ArrayList; import java.util.List; public class ChatServerThread extends Thread { private static List<ChatServerThread> ArrayList<ChatServerThread>(); private Socket socket; public ChatServerThread(Socket socket) { super(); this.socket = socket; threads.add(this); } threads = new
  • 10. public void run() { InputStream in = null; String message; int size; byte[] w = new byte[10240]; try { System.err.println("ChatServerThread start"); in = socket.getInputStream(); while(true) { try { size = in.read(w); if (size <= 0) { throw new IOException(); } message = new String(w, 0, size, "UTF8"); System.out.println(message); sendMessageAll(message); } catch(IOException e) { System.out.println("ChatServerThread stop"); socket.close(); threads.remove(this); return; } } } catch (IOException e) { System.err.println(e); } } public void sendMessageAll(String message) { for (ChatServerThread thread : threads) {
  • 11. if (thread.isAlive()) { thread.sendMessage(this, message); } } System.out.println(message); } public void sendMessage(ChatServerThread talker, String message) { try { OutputStream out = socket.getOutputStream(); byte[] w = message.getBytes("UTF8"); out.write(w); out.flush(); } catch (IOException e) { } } } ソースを記述したら、Java アプリケーションとして実行してください。 その後、Android アプリを起動します。 2. HTTP 通信を行う Android アプリ HTTP 通信の GET/POST メソッドを行ってネット上の情報を表示するアプリを作成します。 ソースコード Eclipse を開いて、パッケージエクスプローラーで右クリックし、[新規]->[Android プロジ ェクト]を選択します。 プロジェクト名は 「HttpEx」 としてください。 Target SDK と Compile With は Android4.0(IceCreamSandwich)を選びます。ActivityName は「HttpEx」としま しょう。 プロジェクトが作成出来たら、src.com.example.httpex フォルダの HttpEx.java ファイル を以下のように編集してください。 また、AndroidManifest.xml を開き、 『Permission』タブの中の Add ボタンをクリックし て、 『User Permission』を選択します。Name は『android.permission.INTERNET』を選 択してください。 package com.example.httpex;
  • 12. import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.view.Window; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; public class HttpEx extends Activity implements View.OnClickListener{ private static final int WC = LinearLayout.LayoutParams.WRAP_CONTENT; private static final int MP = LinearLayout.LayoutParams.MATCH_PARENT; private EditTexteditText; // リクエスト先の URL private static final String URL = "http://httpserverex.herokuapp.com/hello"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); // レイアウトの生成 LinearLayout layout = new LinearLayout(this); layout.setBackgroundColor(Color.rgb(255, 255, 255));
  • 13. layout.setOrientation(LinearLayout.VERTICAL); setContentView(layout); // エディットテキストの生成 editText = new EditText(this); editText.setText("", EditText.BufferType.NORMAL); editText.setLayoutParams(new LinearLayout.LayoutParams(MP, WC)); layout.addView(editText); layout.addView(makeButton("HTTP 通信", "read")); } /** * ボタンの生成 * @param text * @param tag * @return */ private Button makeButton(String text, String tag) { Button button = new Button(this); button.setText(text); button.setTag(tag); button.setOnClickListener(this); button.setLayoutParams(new LinearLayout.LayoutParams(WC, WC)); return button; } @Override public void onClick(View arg0) { String tag = (String) arg0.getTag(); if (tag.equals("read")) { Thread thread = new Thread(new Runnable() { String text = null;
  • 14. @Override public void run() { // HTTP 通信 try { text = String(httpToData(URL)); } catch (Exception e) { text = null; } Handler handler = new Handler(); handler.post(new Runnable() { @Override public void run() { if (text != null) { editText.setText(text, TextView.BufferType.EDITABLE); } else { HttpEx.showDialog(HttpEx.this, "エラー", "読み込みに失敗しました"); } } }); } }); thread.start(); } } public static byte[] httpToData(String path) throws Exception { byte[] write = new byte[1024]; HttpURLConnection connection = null; InputStream in = null; ByteArrayOutputStream out = null; try { // HTTP 接続のオープン new
  • 15. URL url = new URL(path); connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.connect(); in = connection.getInputStream(); out = new ByteArrayOutputStream(); int size; while ((size = in.read(write)) > 0) { out.write(write, 0, size); } out.close(); in.close(); connection.disconnect(); return out.toByteArray(); } catch (Exception e) { try { if (connection != null) { connection.disconnect(); } if (in != null) { in.close(); } if (out != null) { out.close(); } } catch (Exception e2) { } throw e; } } private static void showDialog(Context context, String title, String text) { AlertDialog.Builder ad = new AlertDialog.Builder(context); ad.setTitle(title);
  • 16. ad.setMessage(text); ad.setPositiveButton("OK", null); ad.show(); } } ソースが記述出来たら、Android Application として実行してください。 <演習> GET リクエストで上記の URL にアクセスしていますが、POST 用のボタンを追加し、そ のボタンをクリックされた場合は、POST リクエストを行うように修正しなさい。 また、リクエストクエリも追加で送信出来るように修正しなさい。